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

如果不小心弄错了setter可以用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,那么您必须向 class 添加新的构造函数并使用 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));