3

以下のコードは、Automapper の v3 では機能していましたが、v5 では機能しなくなりました。 UPDATE v4でも動作します。

CallScheduleProfileそのコンストラクターでTitle、値を渡すクラスのインスタンスにプロパティを設定しますtrue

CallScheduleProfileViewModelそのコンストラクターで、とTitleの値を渡す別のクラスのインスタンスにプロパティを設定します。true"Title"

AutoMapper で 4 つのクラスすべてのマッピングをセットアップしてから、Map を呼び出します。

その結果、マップの後、TitleプロパティCallScheduleProfileViewModelのブール値はありますtrueFriendlyName、コンストラクターで設定されていても空です。

私が信じているのは、コンストラクターCallScheduleProfileViewModelが呼び出されFriendlyNameて割り当てられているということですが、マッピングが発生すると、コンストラクターが呼び出され、存在するEntryプロパティがマップされ、それがプロパティにUxEntry割り当てられ、TitleデフォルトFriendlyNameでは null になります。その値FriendlyNameに存在しないUxEntryものはコピーされません。

FriendlyNameその仮定は間違っているかもしれませんが、どちらにしても、マッピングにデータを入力するにはどうすればよいですか?

更新: ネストされた型に関する Automapperのドキュメントを確認しましたが、ドキュメントで提供されているコードにも問題が存在します。文字列プロパティをコンストラクターに追加してInnerDestその値を設定すると、その値が null になった後です。OuterDestMap

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; }
}
4

1 に答える 1