2016-06-02 19 views
0

私は、次のクラスがありますはAutomapperは子供に継承されたオブジェクトをマップ

出典:

public class Source 
{ 
    public int Amount { get; set; } 
} 

先:私は作成しようとしているマップの

public class Parent 
{ 
    public ChildBase Child { get; set; } 
} 

public class ChildBase 
{ 

} 

public class Child : ChildBase 
{ 
    public int Amount { get; set; } 
} 

、I SourceからParentにマップします。 ParentのプロパティはChildBaseと定義されていますが、マップを実際にChildにマップします。マッパをChildにマップするにはどうすればよいですか?

CreateMap<Source, Parent>() 
    .ForMember(d => d.Child, opt => opt.MapFrom(s => s)); 

CreateMap<Source, Child>(); 

しかし、明らかに、これはChildBaseの先でマップを探すためにしようとしている:

は、私はシンプルなマップのように定義されています。私は宛先を Childにキャストしようとしましたが、うまくいきませんでした。

アイデア?

+0

あなたは試しましたか?<>()か.IncludeBase <>()を含めてください。 – Soren

答えて

0

AutoMapperでカスタムValueResolverを使用する必要があります。

Mapper.CreateMap<Source, Parent>() 
    .ForMember(p => p.Child, o => o.ResolveUsing(s => new Child { Amount = s.Amount })); 

このロジックを再利用する場合は、コードをラムダ式ではなくクラスに入れることができます。

class SourceToChildValueResolver : ValueResolver<Source, Child> 
{ 
    protected override Child ResolveCore(Source source) 
    { 
     return new Child { Amount = source.Amount }; 
    } 
} 

//register the resolver 
CreateMap<Source, Parent>() 
    .ForMember(p => p.Child, o => o.ResolveUsing<SourceToChildValueResolver>()); 
+0

定義済みのマップを手動でマッピングする代わりに使用できますか?また、私は静的バージョンを使用していないので、それは確信していませんが、私はオブジェクトを 'Resolve'にキャストしなければなりません:' s => new Child {Amount =((Source)s.Value)Amount} '' sは 'ResolutionResult'です – ADringer

+0

@ADringerあなたはAutoMapper 5.0+を使用していますか?私の編集を参照してください。 –

+0

はい、4.2.1を使用しています – ADringer

関連する問題