【问题标题】:Map a class with List of class in it into another class of similar property using "AutoMapper"使用“AutoMapper”将一个包含类列表的类映射到另一个类似属性的类中
【发布时间】:2019-07-24 10:47:17
【问题描述】:

好的,我的问题是我不明白如何使用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-core automapper


    【解决方案1】:

    来自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);
    
    }
    

    我希望这是有道理的。

    【讨论】:

    • 您的解决方案对我帮助很大!但是我确实使用 AfterMap 实例化了 ClassB2Object,否则与您的代码相同。再次感谢
    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2017-07-08
    • 2010-11-13
    • 2021-04-30
    • 2021-10-13
    • 2021-02-06
    相关资源
    最近更新 更多