以下のコードは、Automapper の v3 では機能していましたが、v5 では機能しなくなりました。 UPDATE v4でも動作します。
CallScheduleProfile
そのコンストラクターでTitle
、値を渡すクラスのインスタンスにプロパティを設定しますtrue
。
CallScheduleProfileViewModel
そのコンストラクターで、とTitle
の値を渡す別のクラスのインスタンスにプロパティを設定します。true
"Title"
AutoMapper で 4 つのクラスすべてのマッピングをセットアップしてから、Map を呼び出します。
その結果、マップの後、Title
プロパティCallScheduleProfileViewModel
のブール値はありますtrue
がFriendlyName
、コンストラクターで設定されていても空です。
私が信じているのは、コンストラクターCallScheduleProfileViewModel
が呼び出されFriendlyName
て割り当てられているということですが、マッピングが発生すると、コンストラクターが呼び出され、存在するEntry
プロパティがマップされ、それがプロパティにUxEntry
割り当てられ、Title
デフォルトFriendlyName
では null になります。その値FriendlyName
に存在しないUxEntry
ものはコピーされません。
FriendlyName
その仮定は間違っているかもしれませんが、どちらにしても、マッピングにデータを入力するにはどうすればよいですか?
更新: ネストされた型に関する Automapperのドキュメントを確認しましたが、ドキュメントで提供されているコードにも問題が存在します。文字列プロパティをコンストラクターに追加してInnerDest
その値を設定すると、その値が null になった後です。OuterDest
Map
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; }
}