4

単一の固定サイズの配列配列を複数のプロパティにマップする必要があります。たとえば、このクラスが与えられた場合:

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

配列をこのクラスにマップしたい

public class Dest
{
    public int Item1 { get; set; }
    public int Item2 { get; set; }
    public int Item3 { get; set; }
    public int Item4 { get; set; }
}

AutoMapperを使用して(実際に個々のフィールドをマッピングせずに)それを行う簡単な方法はありますか?

4

1 に答える 1

6

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

使用法:

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

更新:いいえ、簡単な方法はありません。AutoMapperは、プロパティFooをソースプロパティBarのインデックスNの要素にマップする必要があることをどのように理解しますか?このすべての情報を提供する必要があります。

更新:Automapperから

Projectionは、オブジェクトモデルをフラット化するだけでなく、ソースを宛先に変換します。追加の構成がない場合、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]
}
于 2012-04-04T14:30:59.777 に答える