首页 > 解决方案 > 使用“AutoMapper”将一个包含类列表的类映射到另一个类似属性的类中

问题描述

好的,所以我的问题是我不明白如何使用Automapper 映射以下类。

ClassA
{
    List<ClassA1> classA1 {get; set;}

    ClassA2 ClassA2Object {get; set;}
}

ClassB
{
    List<ClassB1> classB1 {get; set;}

    ClassB2 ClassB2Object {get; set;}
}

我已经将它映射为

CreateMap<ClassA, ClassB>();

我已经搜索并发现使用 ForPath() 和 AfterMap() 来设置值但未能映射类列表任何人都知道在这种情况下 CreateMap 的正确方法?

标签: c#.net.net-coreautomapper

解决方案


来自AutoMapper 文档

AutoMapper 只需要配置元素类型,而不需要任何可能使用的数组或列表类型。

只要列表中的类型之间存在映射,例如。ClassA1并且ClassB1,它应该可以正常工作。

但是,由于 和 中的属性名称不同ClassAClassB您需要明确地教 AutoMapper 如何映射这些属性(我稍微更改了您的代码以具有公共属性):

public class ClassA
{
    public List<ClassA1> classA1 { get; set; }

    public ClassA2 ClassA2Object { get; set; }
}

public class ClassB
{
    public List<ClassB1> classB1 { get; set; }

    public ClassB2 ClassB2Object { get; set; }
}

然后你可以像这个例子一样使用它:

class Program
{
    static void Main(string[] args)
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<ClassA, ClassB>()
            .ForMember(dst => dst.classB1, opt => opt.MapFrom(src => src.classA1))
            .ForMember(dst => dst.ClassB2Object, opt => opt.MapFrom(src => src.ClassA2Object));
            cfg.CreateMap<ClassA1, ClassB1>();
            cfg.CreateMap<ClassA2, ClassB2>();
        });

        var mapper = config.CreateMapper();

        var a = new ClassA
        {
            classA1 = new List<ClassA1> { new ClassA1() },
            ClassA2Object = new ClassA2()
        };

        var b = mapper.Map<ClassB>(a);

        Debug.Assert(b.classB1 != null);
        Debug.Assert(b.classB1.Count == a.classA1.Count);
        Debug.Assert(b.ClassB2Object != null);

}

我希望这是有道理的。


推荐阅读