在 c#/dotnet 中使用 AutoMapper 进行映射时出现错误映射类型

问题描述 投票:0回答:1

在我的 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));
    //...
}

我尝试使用上面的代码进行映射,但是它抛出异常(如上所述)。虽然,一切看起来都很好。

c# .net automapper
1个回答
0
投票

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 能够创建实例。

© www.soinside.com 2019 - 2024. All rights reserved.