我需要将单个固定大小的数组数组映射到多个属性.例如给出这个类:
public class Source
{
public int[] ItemArray{get;set} // always 4 items
}
Run Code Online (Sandbox Code Playgroud)
我想将数组映射到此类
public class Dest
{
public int Item1{get;set;}
public int Item1{get;set;}
public int Item1{get;set;}
public int Item1{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来使用AutoMapper(没有实际映射每个单独的字段)?
为Dest的属性创建映射:
Mapper.CreateMap<Source, Dest>()
.ForMember(d => d.Item1, o => o.MapFrom(s => s.ItemArray[0]))
.ForMember(d => d.Item2, o => o.MapFrom(s => s.ItemArray[1]))
.ForMember(d => d.Item3, o => o.MapFrom(s => s.ItemArray[2]))
.ForMember(d => d.Item4, o => o.MapFrom(s => s.ItemArray[3]));
Run Code Online (Sandbox Code Playgroud)
用法:
Source source = new Source() { ItemArray = new int[] { 1, 2, 3, 4 } };
Dest dest = Mapper.Map<Source, Dest>(source);
Run Code Online (Sandbox Code Playgroud)
更新:不,没有简单的方法.AutoMapper将如何理解,您的属性Foo应该映射到源属性Bar中索引N处的元素?你应该提供所有这些信息.
更新:来自Automapper
投影将源转换为目标,而不是展平对象模型.如果没有额外的配置,AutoMapper需要一个展平的目标来匹配源类型的命名结构.如果要将源值投影到与源结构不完全匹配的目标中,则必须指定自定义成员映射定义.
所以,是的.如果命名结构不匹配,则必须为成员指定自定义映射.
更新:嗯,实际上你可以手动完成所有转换(但我不认为这是更好的方法,特别是如果你有其他属性可以按名称映射):
Mapper.CreateMap<Source, Dest>().ConstructUsing((s) => new Dest()
{
Item1 = s.ItemArray[0],
Item2 = s.ItemArray[1],
Item3 = s.ItemArray[2],
Item4 = s.ItemArray[3]
}
Run Code Online (Sandbox Code Playgroud)