2012-04-04 46 views
4

1つの固定サイズの配列を複数のプロパティにマップする必要があります。たとえば は、このクラスを与えられた:私はこのクラスにAutoMapperを使用して配列を複数のプロパティにマッピングする方法は?

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

を配列をマッピングしたい

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

は(実際には、個々のフィールドをマッピングせず)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:いいえ、簡単な方法がありません。あなたのプロパティFooは、ソースプロパティバーのインデックスNの要素にマップされるべきであることをAutoMapperがどのように理解するでしょうか?このすべての情報を提供する必要があります。

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

そこで、基本的いいえ... –

+0

@Dror Helperはい、automapper wikiの引用符で私の最後の更新を見てください。 –

+0

はい、カスタムコンバーターや他の機能などのトリックがあるかもしれませんが、おそらくそのうちの1つが助けになるでしょう –

関連する問題