automapper概要文件类使用现有的映射定义

问题描述

我有3类:A,B和C,其中A和B都应转换为C,而A是B的包装:

public class C
{
    public int Id { get; set; }
    public string Title { get; set; }
    // other properties ...
}

public class B
{
    public int Id { get; set; }
    public string Title { get; set; }
    // other properties ...
}

public class A
{
    public int IdA { get; set; }
    public B Data { get; set; }
}

然后我使用自动映射器配置文件类创建映射:

public class MapperProfile: Profile
{
    public MapperProfile()
    {
        CreateMap<B,C>();
        CreateMap<A,C>();
    }
}

从A映射到C时,我想用A的Id覆盖C的IdA,而Data中的其他所有内容都填充到C中的其他属性,这实际上是定义的映射与CreateMap<B,C>()

对stackoverflow的搜索建议使用ConvertUsing,但这需要一个映射器实例,而我在Profile类中没有实例。有什么想法吗?

解决方法

您可以使用ConverUsing重载来实现此目的。您的映射配置文件如下所示:

 CreateMap<B,C>();
 CreateMap<A,C>()
        .ConvertUsing((src,dst,ctx) =>
        {
            var c = ctx.Mapper.Map<C>(src.Data);
            c.Id = src.IdA;
            return c;
        });