以下のコードはAutomapperのv3で動作していますが、v5では動作していません。 UPDATE v4でも動作します。Automapper v5アップグレード後の空のプロパティ値
CallScheduleProfile
は、true
という値を渡すクラスのインスタンスに対して、Title
プロパティを設定します。コンストラクタで
CallScheduleProfileViewModel
はtrue
と"Title"
の値を渡し、異なるクラスのインスタンスにTitle
プロパティを設定します。
すべての4つのクラスに対してAutoMapperでマッピングを設定してから、Mapを呼び出します。
結果はマップ後CallScheduleProfileViewModel
上Title
プロパティはtrue
のブール値を持っていますが、FriendlyName
は、それがそのコンストラクタで設定されていてもかかわらず、空であることです。
何が起こっていると考えていることCallScheduleProfileViewModel
のコンストラクタが呼び出されるとFriendlyName
が割り当てられてきているということですが、マッピングが発生したときに、それはEntry
にコンストラクタを呼び出して、存在しUxEntry
上の任意のプロパティをマップし、Title
にそれを割り当てデフォルトではFriendlyName
はnullになり、FriendlyName
はUxEntry
に存在しないため、その値はコピーされません。
私はその仮定で間違っているかもしれませんが、いずれにしても、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; }
}
:その他の変更なしで、あなたのコードを実行する
は、次の出力を生成します。@MonWow、CreateMap()。ForMember(dest => dest.Title、o => o.UseDestinationValue()); 'また、 –
Jon
を処理しました。 – Fabjan