在 C# 和 .NET 中使用 AutoMapper 进行映射时出现错误映射类型

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

在我的 C# 项目中,我使用 AutoMapper 从一种类型 (

CommonInstanceDTOMap
) 映射到另一种类型 (
CommonInstanceDTO
)。

执行代码时会抛出异常(如下)。

错误追踪
映射类型错误。

映射类型:
CommonInstanceDTOMap -> CommonInstanceDTO
Cube.Mapper.Entities.CommonInstanceDTOMap -> Ild_Music.Core.Instances.DTO.CommonInstanceDTO

类型映射配置:
CommonInstanceDTOMap -> CommonInstanceDTO
Cube.Mapper.Entities.CommonInstanceDTOMap -> Ild_Music.Core.Instances.DTO.CommonInstanceDTO

目的地会员:
void .ctor(System.Guid, System.ReadOnlyMemory

1[System.Char], System.ReadOnlyMemory
1[System.Byte], Ild_Music.Core.Instances.EntityTag), 参数名称

下面有类型和配置文件。

//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.