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));
所以我有一个带有一个列表的源对象,该列表包含两种类型的值,但我希望目标有两个列表,每个值一个,但结果相同 属性。我希望这里的例子是不言自明的。
我的来源:
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));