2016-08-01 4 views
3

以下のコードはAutomapperのv3で動作していますが、v5では動作していません。 UPDATE v4でも動作します。Automapper v5アップグレード後の空のプロパティ値

CallScheduleProfileは、trueという値を渡すクラスのインスタンスに対して、Titleプロパティを設定します。コンストラクタで

CallScheduleProfileViewModeltrue"Title"の値を渡し、異なるクラスのインスタンスにTitleプロパティを設定します。

すべての4つのクラスに対してAutoMapperでマッピングを設定してから、Mapを呼び出します。

結果はマップ後CallScheduleProfileViewModelTitleプロパティはtrueのブール値を持っていますが、FriendlyNameは、それがそのコンストラクタで設定されていてもかかわらず、空であることです。

何が起こっていると考えていることCallScheduleProfileViewModelのコンストラクタが呼び出されるとFriendlyNameが割り当てられてきているということですが、マッピングが発生したときに、それはEntryにコンストラクタを呼び出して、存在しUxEntry上の任意のプロパティをマップし、Titleにそれを割り当てデフォルトではFriendlyNameはnullになり、FriendlyNameUxEntryに存在しないため、その値はコピーされません。

私はその仮定で間違っているかもしれませんが、いずれにしても、FriendlyNameはどのようにマッピングされますか?

更新:Automapper documentationをネストされたタイプで調べましたが、この問題はドキュメントにも記載されています。 InnerDestに文字列プロパティを追加し、その値をOuterDestコンストラクタに設定した場合、Mapの値の後にnull値があります。

public static void Main(string[] args) 
{ 
    Mapper.Initialize(cfg => 
    { 
     cfg.CreateMap<UxEntry<bool>, Entry<bool>>(); 

     cfg.CreateMap<CallScheduleProfile, CallScheduleProfileViewModel>(); 
    }); 

    var old = new CallScheduleProfile(); 

    var newmodel = Mapper.Map<CallScheduleProfile, CallScheduleProfileViewModel>(old); 

    Console.WriteLine(newmodel.Title.Value); 
    Console.WriteLine(newmodel.Title.FriendlyName); 
} 

public class UxEntry<T> 
{ 
    public static implicit operator T(UxEntry<T> o) 
    { 
     return o.Value; 
    } 

    public UxEntry() 
    { 
     this.Value = default(T); 
    } 

    public UxEntry(T value) 
    { 
     this.Value = value; 
    } 

    public T Value { get; set; } 
} 


public class CallScheduleProfile 
{ 
    public CallScheduleProfile() 
    { 
     this.Title = new UxEntry<bool>(true); 
    } 

    public UxEntry<bool> Title { get; set; } 

} 

public class Entry<T> 
{ 
    public Entry() 
    { 
    } 

    public Entry(T value, string friendlyName) 
    { 
     this.Value = value; 
     this.FriendlyName = friendlyName; 
    } 

    public T Value { get; set; } 
    public string FriendlyName { get; set; } 

    public static implicit operator T(Entry<T> o) 
    { 
     return o.Value; 
    } 
} 


public class CallScheduleProfileViewModel 
{ 
    public CallScheduleProfileViewModel() 

    { 
     this.Title = new Entry<bool>(true, "Title"); 
    } 
    public Entry<bool> Title { get; set; } 
} 

答えて

0

まあ、Automapperのでnullに、このプロパティをマップ:タイプEntry<T>セット用

A)コンストラクタnull

Bに、このプロパティ)Automapperは(後)Entry<T>の新しいインスタンスを作成します! CallScheduleProfileViewModelのコンストラクターが呼び出されます。

C)あなたがここに何ができるかAutomapper

に設定された他のルールはありませんあなたはAutomapperプロパティの1のために使用されるデフォルト値が存在すべきであることを知らせるように、設定を変更することです:

 Mapper.Initialize(cfg => 
     { 
      // when UxEntry is mapped to Entry value "Title" is used for property FriendlyName 
      cfg.CreateMap<UxEntry<bool>, Entry<bool>>() 
       .ForMember(dest => dest.FriendlyName, opt => opt.UseValue("Title")); 

      cfg.CreateMap<CallScheduleProfile, CallScheduleProfileViewModel>(); 
     }); 

今度は、CallScheduleProfileViewModelのコンストラクタから冗長プロパティの初期化を削除できます。私は実際に `CFGを見つけ

true  
Title 
+0

:その他の変更なしで、あなたのコードを実行する

は、次の出力を生成します。@MonWow、CreateMap ()。ForMember(dest => dest.Title、o => o.UseDestinationValue()); 'また、 – Jon

+0

を処理しました。 – Fabjan

関連する問題