繁体   English   中英

AutoMapper将一个列表映射到具有派生属性的两个大小相等的列表

[英]AutoMapper map one list to two equally sized lists with derived properties

因此,我有一个带有一个列表的源对象,该列表包含两种类型的值,但是我希望目标具有两个列表,每个列表一个,但具有相同的结果属性。 我希望这里的例子可以自我解释。

我的资料来源:

    public class SourceObject
    {
        public SourceObject()
        {
            SourceList = new List<AnotherSourceObject>();
        }

        public IList<AnotherSourceObject> SourceList { get; private set; }

        //some other properties
    }

    public class AnotherSourceObject
    {
        public int Number { get; set; }
        public decimal Value1 { get; set; }
        public decimal Value2 { get; set; }
        public decimal Total { get; set; }
    }

我的目的地:

    public class DestObject
    {
        public DestObject()
        {
            ValueOneList = new List<AnotherDestObject>();
            ValueOneList = new List<AnotherDestObject>();
        }

        public IList<AnotherDestObject> ValueOneList { get; private set; }
        public IList<AnotherDestObject> ValueTwoList { get; private set; }

        //some other properties that map perfectly
    }

    public class AnotherDestObject
    {
        public int Number { get; set; }
        public decimal Value { get; set; }
    }

我的Automapper映射:

    Mapper.CreateMap<Source, DestObject>()
        .ForMember(dest => dest.ValueOneList, opt => opt.MapFrom(source => source.SourceList)) //get value1 to Value
        .ForMember(dest => dest.ValueTwoList, opt => opt.MapFrom(source => source.SourceList))  //get value2 to Value

您可以使用AfterMap如果您不小心制定者private

Mapper.CreateMap<Source, DestObject>()
     .AfterMap((src, dest) =>
     {
         foreach (var item in src.SourceList)
         {
             dest.ValueOneList.Add(new AnotherDestObject { Number = item.Number, Value = item.Value1 });
             dest.ValueTwoList.Add(new AnotherDestObject { Number = item.Number, Value = item.Value2 });
         }
     });

如果setter必须是private ,则必须将新的构造方法添加到类中并使用ConstructUsing()

添加此构造函数:

  public DestObject(List<AnotherSourceObject>() sourceList)
    {
        ValueOneList = sourceList.Select(x => new AnotherDestObject { Number = item.Number, Value = item.Value1 }).ToList();
        ValueTwoList = sourceList.Select(x => new AnotherDestObject { Number = item.Number, Value = item.Value2 }).ToList();
    }

接着:

Mapper.CreateMap<Source, DestObject>()
            .ConstructUsing(src => new DestObject(src.SourceList));

暂无
暂无

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

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