web-dev-qa-db-ja.com

ターゲット値に基づくC#AutoMapper条件付きマッピング

AutoMapperで条件付きマッピングを使用して、既存のTARGETプロパティ値に基づいてSOURCEオブジェクトからTARGETオブジェクトの値をマップする方法をアドバイスできますか?

したがって、私のソースクラスは次のとおりです。

public class UserDetails
{
    public String Nickname { get; set; }
}

私のターゲットクラスは次のとおりです。

public class ProfileViewModel
{
    public Boolean NicknameIsVisible { get; set;
    public String Nickname { get; set; }
}

ターゲットプロパティの「NicknameIsVisible」値がすでにTRUEに設定されている場合にのみ、TARGETの「Nickname」プロパティ値をSOURCEの「Nickname」プロパティ値と一致するように設定します。それ以外の場合は、TARGETの「Nickname」プロパティを設定します。空の文字列への値。

私はこのようなものを試していました(コンパイルされません)...

Mapper.CreateMap<UserDetails, ProfileViewModel>()
.ForMember(
            destination => destination.Nickname,
            option => option.
                .MapFrom(
                    source => source.NicknameIsVisible ? 
                    source.Nickname :
                    String.Empty)
);

しかし、「NicknameIsVisible」は私のSOURCEのプロパティではなく、私のTARGETのプロパティです。

ところで、My ProfileViewModelは、Owain Wraggのメソッドを使用して3つのエンティティにバインドされています( http://consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx )これは、「NicknameIsVisible」プロパティに値を与える別のエンティティです。

この問題に使用する正しい構文を誰かが提案できますか?

12
Dib

Devduderの例を使用すると、コンパイルする次のコードができました。

.ForMember(
    destination => destination.Nickname,
    option => 
    {
        option.Condition(resolutionContext =>
            (resolutionContext.InstanceCache.First().Value as ProfileViewModel).NicknameIsVisible);
        option.MapFrom(source => source.Nickname);
    }
);

ただし、コンパイルして実行しても、destination.Nicknameには何も入力されません。

編集:マッピングの順序を変更して、設定オブジェクト( "NicknameIsVisible"プロパティの値が最初にマッピングされたため、値をテストできるようにする必要がありました!)

したがって、私の3方向マッピングへの呼び出しは次のとおりです。

var profileViewModel = EntityMapper.Map<ProfileViewModel>(preferences, member, account);

これにより、preferencesオブジェクトが最初にViewModelにマップされ、次にaccountオブジェクトの条件付きマッピングが値が設定された後に実行されるようになりました。セットする。

これが私の解決策ですが、自分の答えに賛成票を投じることはできません!

2
Dib

これを試して:

Mapper.CreateMap<UserDetails, ProfileViewModel>()
.ForMember(
        destination => destination.Nickname,
        option => 
        {
            option.Condition(rc => 
            {
                var profileViewModel = (ProfileViewModel)rc.InstanceCache.First().Value;
                return profileViewModel.NicknameIsVisible;
            });

            option.MapFrom(source => source.Nickname);
        }
);
15
devduder