首页 > 解决方案 > AutoMapper:映射记录类型的问题

问题描述

我在这个类的 c# 9 中使用 automapper 10.1.1 进行映射

public record BFrom 
{
    public Guid Id { get; init; }
    public Guid DbExtraId { get; init; }
}

进入这个

public record ATo(Guid Id, Guid ExtraId) : BaseTo(Id);

并具有以下配置

CreateMap<BFrom, ATo>()
    .ForMember("ExtraId", opt => opt.MapFrom(src => src.DbExtraId))
    .ReverseMap();

但是当我尝试映射它时会遇到一个问题,它会抛出一个异常,并带有一条消息,该消息需要一个带有 0 args 或只有可选 args 的构造函数。是否可以在不更改记录类型的情况下解决此问题?

标签: c#automapper

解决方案


我遇到了同样的问题,最终创建了这个扩展方法来解决它:

public static class AutoMapperExtensions
{
    public static IMappingExpression<TSource, TDestination> MapRecordMember<TSource, TDestination, TMember>(
        this IMappingExpression<TSource, TDestination> mappingExpression,
        Expression<Func<TDestination, TMember>> destinationMember, Expression<Func<TSource, TMember>> sourceMember)
    {
        var memberInfo = ReflectionHelper.FindProperty(destinationMember);
        string memberName = memberInfo.Name;
        return mappingExpression
            .ForMember(destinationMember, opt => opt.MapFrom(sourceMember))
            .ForCtorParam(memberName, opt => opt.MapFrom(sourceMember));
    }
}

然后你只需像这样使用它:

CreateMap<BFrom, ATo>()
    .MapRecordMember(a => a.ExtraId, src => src.DbExtraId)
    .ReverseMap();

它将负责注册构造函数和成员,这样您就不会遇到此类问题。


推荐阅读