私は次のモデルを持っています:
public class Tag
{
public int Id { get; set; }
public string Name { get; set; }
}
AutoMapperを使用して、Name
タイプのTag
プロパティを、ビューモデルの1つで文字列プロパティにマップできるようにしたいと思います。
次のコードを使用して、このマッピングを処理しようとするカスタムリゾルバーを作成しました。
public class TagToStringResolver : ValueResolver<Tag, string>
{
protected override string ResolveCore(Tag source)
{
return source.Name ?? string.Empty;
}
}
次のコードを使用してマッピングしています:
Mapper.CreateMap<Tag, String>()
.ForMember(d => d, o => o.ResolveUsing<TagToStringResolver>());
アプリケーションを実行すると、エラーが発生します。
メンバーのカスタム構成は、タイプの最上位の個々のメンバーに対してのみサポートされています。
何が悪いのですか?
これは、宛先タイプのプロパティではなく、実際の宛先タイプにマップしようとしているためです。あなたはあなたが望むものを達成することができます:
Mapper.CreateMap<Tag, string>().ConvertUsing(source => source.Name ?? string.Empty);
ただし、TagクラスのToStringをオーバーライドするだけの方がはるかに簡単です。
ForMemberは、タイプ間のマッピングが必要なメンバーにマッピングを提供することを意味します。代わりに、これを使用してください:
Mapper.CreateMap<Tag, String>().ConvertUsing<TagToStringConverter>();
そしてコンバーターは
public class TagToStringConverter : ITypeConverter<Tag, String>
{
public string Convert(ResolutionContext context)
{
return (context.SourceValue as Tag).Name ?? string.Empty;
}
}