繁体   English   中英

使用“ AutoMapper”将其中具有类列表的类映射到具有类似属性的另一个类中

[英]Map a class with List of class in it into another class of similar property using “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的正确方法吗?

来自AutoMapper docs

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

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

但是,由于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);

}

我希望这是有道理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM