tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

AutoMapperでifって書きたいときどうするか

http://taswar.zeytinsoft.com/wp-content/uploads/2011/03/automapper-logo.jpg


automapper.org

C#のWEB開発ではAutoMapperが欠かせないレベルでかなり重要なのですが、完全にマッピングするのはやっぱり難しかったりします。MapFromだと三項演算子しか書けなくて読みづらい場合も出てくるのでifでかける方法を探しましたらあったので、備忘録的に書き残しときます。

まず普通のMapFromで書く場合(下のリンク丸々引用)

Mapper.CreateMap<SomeViewModels, SomeDTO>()
    .ForMember(dest => dest.Date,
            opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString())));

この程度ならいいのですが、もうちょい複雑になると困ります。なのでifで書くときはResolveUsingを使います。

ResolveUsingの使い方

Mapper.CreateMap<SomeViewModels, SomeDTO>()               
         .ForMember(dest => dest.Date, o => o.ResolveUsing(Converter));

private static object Converter(SomeViewModels value)
{
    DateTime? finalDate = null;
    if (value.Date.HasDate == "N")
    {
        // so it should be null
    }
    else
    {                                   
        finalDate = DateTime.Parse(value.Date.ToString());
    }                               
    return finalDate;
}

Funcを渡せるので非常にわかりやすくなりました。MapFromとResolveUsingだと若干違います。

void MapFrom<TSourceMember>(Expression<Func<TSource, TSourceMember>> sourceMember);
void ResolveUsing<TResult>(Func<TSource, TResult> resolver);

ResolveUsingはExpressionがないですね。これだと完全マッピングの道に近づくからうれしい!(まぁ、AutoMapperで完全マッピングすると逆にカオスになりそうですが笑)