2012-04-04 86 views
4

我需要将单个固定大小的数组映射到多个属性。 例如给出这个类:如何使用AutoMapper将数组映射到多个属性?

public class Source 
{ 
    public int[] ItemArray{get;set} // always 4 items 
} 

我想数组映射到这个类

public class Dest 
{ 
    public int Item1{get;set;} 
    public int Item1{get;set;} 
    public int Item1{get;set;} 
    public int Item1{get;set;} 
} 

有一个简单的方法与AutoMapper做(而不实际映射每个单独的现场)?

回答

5

为目的地的属性创建映射:

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])); 

用法:

Source source = new Source() { ItemArray = new int[] { 1, 2, 3, 4 } }; 
Dest dest = Mapper.Map<Source, Dest>(source); 

UPDATE:没有,有没有简单的方法。 AutoMapper如何理解,你的属性Foo应该被映射到源属性Bar中的索引N处的元素?你应该提供所有这些信息。

UPDATE:从Automapper

投影变换源到目的地以外平坦化对象模型。如果没有额外的配置,AutoMapper需要一个平坦的目的地来匹配源类型的命名结构。如果要将源值映射到与源结构不完全匹配的目标,则必须指定自定义成员映射定义。

所以,是的。如果命名结构不匹配,则必须为成员指定自定义映射。

UPDATE: 嗯,其实你可以手动执行所有转换(但我不认为这是更好的方法,特别是如果你有可能通过名称映射其他属性):

Mapper.CreateMap<Source, Dest>().ConstructUsing((s) => new Dest() 
{ 
    Item1 = s.ItemArray[0], 
    Item2 = s.ItemArray[1], 
    Item3 = s.ItemArray[2], 
    Item4 = s.ItemArray[3] 
} 
+0

所以基本上没有... – 2012-04-04 17:18:08

+0

@Dror Helper是的,看到我最后一次更新automapper wiki的报价。 – 2012-04-04 17:27:19

+0

是的 - 但有一些技巧,如自定义转换器和其他设施,也许其中一个将帮助 – 2012-04-04 17:34:10

相关问题