在我的 C# 项目中,我使用 AutoMaper 从一种类型映射到另一种类型 (CommonInstanceDTOMap) 和 (CommonInstanceDTO)。
执行代码时会抛出异常(如下)。
Error mapping types.
Mapping types:
CommonInstanceDTOMap -> CommonInstanceDTO
Cube.Mapper.Entities.CommonInstanceDTOMap -> Ild_Music.Core.Instances.DTO.CommonInstanceDTO
Type Map configuration:
CommonInstanceDTOMap -> CommonInstanceDTO
Cube.Mapper.Entities.CommonInstanceDTOMap -> Ild_Music.Core.Instances.DTO.CommonInstanceDTO
Destination Member:
Void .ctor(System.Guid, System.ReadOnlyMemory`1[System.Char], System.ReadOnlyMemory`1[System.Byte], Ild_Music.Core.Instances.EntityTag), parameter name
下面有类型和配置文件。
//source type
public record CommonInstanceDTOMap : IMappable
{
public string ID {get; set;}
public string Name {get; set;}
public byte[] Avatar {get; set;}
public EntityTag Tag {get; set;} //enum type
}
//destination type
public struct CommonInstanceDTO
{
public Guid Id {get;}
public ReadOnlyMemory<char> Name {get;}
public ReadOnlyMemory<byte> Avatar {get;}
public EntityTag Tag {get;}
public CommonInstanceDTO(Guid id,
ReadOnlyMemory<char> name,
ReadOnlyMemory<byte> avatar,
EntityTag tag)
{
Id = id;
Name = name;
Avatar = avatar;
Tag = tag;
}
}
//Map profile stuff
public sealed class MapProfile: Profile
{
//...
CreateMap<CommonInstanceDTOMap, CommonInstanceDTO>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => new Guid(src.ID)))
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name.AsMemory()))
.ForMember(dest => dest.Avatar, opt => opt.MapFrom(src =>src.Avatar.AsMemory()))
.ForMember(dest => dest.Tag, opt => opt.MapFrom(src => src.Tag));
//...
}
我尝试使用上面的代码进行映射,但是它抛出异常(如上所述)。虽然,一切看起来都很好。
AutoMapper 不知道如何将
string
转换为 ReadOnlyMemory<char>
实例。这意味着它不知道如何调用 CommonInstanceDTO
的构造函数,特别是如何处理 name
参数。异常消息中也提到了这个参数:
Destination Member:
Void .ctor(System.Guid, ..., ..., ...), parameter name
^^^^
它确实知道如何将
string
(CommonInstanceDTOMap.ID
) 转换为 Guid
(CommonInstanceDTO.ID
),因为有这样一个构造函数 new Guid(string)
。它还知道如何将数组 (CommonInstanceDTOMap.Avatar
) 转换为 ReadOnlyMemory<T>
(CommonInstanceDTO.Avatar
),因为也有这样的构造函数 new ReadOnlyMemory<T>(T[])
。但由于它不知道如何将 string
转换为 ReadOnlyMemory<char>
实例,因此失败了。
您可以指定如何使用以下内容填充构造函数的
name
参数
ForCtorParam()
配置。指定构造函数参数名称和要在映射中使用的值,如下所示:
.ForCtorParam("name", opt => opt.MapFrom(src => src.Name.AsMemory()))
这样所有四个构造函数参数都可以被填充,并且 AutoMapper 能够创建实例。