2014-01-07 8 views
5

カントはこれを理解しているようです。インナープロパティからデスティネーションクラスへの自動マップ

public class DestinationClass 
{ 
    public int InnerPropertyId { get; set; } 
    public string StrignValue { get; set; } 
} 

public class SourceClass 
{ 
    public InnerValue Inner { get; set; } 
} 

public class InnerValue 
{ 
    public int InnerPropertyId { get; set; } 
    public string StrignValue {get;set;} 
} 

私はSourceClass.InnerValueからDestinationClassに直接マップする必要があります。それ、どうやったら出来るの?

ありがとうございます。次のように

答えて

7

、私はポスト質問ボタンを押した直後に:

Mapper.Reset(); 
// from, to 
Mapper.CreateMap<InnerValue, DestinationClass>(); 
Mapper.CreateMap<SourceClass, DestinationClass>() 
    .ConvertUsing(s => Mapper.Map<InnerValue, DestinationClass>(s.Inner)); 

Mapper.AssertConfigurationIsValid(); 

var source = new SourceClass() { Inner = new InnerValue() { InnerPropertyId = 123, StringValue = "somethinges" } }; 

var dest = Mapper.Map<SourceClass, DestinationClass>(source); 
5

マッピングに見えなければならない。いつものように

CreateMap<SourceClass, DestinationClass>() 
    .ForMember(x => x.InnerPropertyId , x => x.MapFrom(z => z.Inner.InnerPropertyId)) 
    .ForMember(x => x.StrignValue , x => x.MapFrom(z => z.Inner.StrignValue)) 
; 
+1

いいえ:)各小道具を手動で設定するのは、私が避けようとしていたものです。 – b0rg

6

我々はConvertUsingがあるためフル装備の結果を与えていないとの問題を持っていました私たちのSourceClassバージョンには、DestinationClassにマップしたい追加の値がありました

次のコードは、 lt:

ConstructUsingは、内部メンバーをマップしてConvertUsingをマッピングした後も残りのメンバーをマップし続けます。

+0

これは本当にいいですが、問題があります:構成の検証に失敗し、 'Mapper.Map s.Inner) 'はまだマップされていないと報告されています – qtuan

+0

私はあなたの問題を解決するための答えを更新しました。 "MemberList.Source"はキーであり、必要な無視回数を減らします。 –

+0

私の理解では、私の場合は許可されていない宛先メンバーの検証を無視しています。私が望むのは、検証がすでに 'ConstructUsing'によってマップされたいくつかの宛先メンバーを理解し、残りのメンバーを検証し続けることです。実行時に 'ConstructUsing'が解決するので、これは不可能だと思います。だから私の結論はあなたの答えに加え、コンパニオンテストを加えることです。ありがとう! – qtuan

関連する問題