web-dev-qa-db-ja.com

AutoMapperを使用してオブジェクトのプロパティを文字列にマップする

私は次のモデルを持っています:

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>());

アプリケーションを実行すると、エラーが発生します。

メンバーのカスタム構成は、タイプの最上位の個々のメンバーに対してのみサポートされています。

何が悪いのですか?

36
marcusstarnes

これは、宛先タイプのプロパティではなく、実際の宛先タイプにマップしようとしているためです。あなたはあなたが望むものを達成することができます:

Mapper.CreateMap<Tag, string>().ConvertUsing(source => source.Name ?? string.Empty);

ただし、TagクラスのToStringをオーバーライドするだけの方がはるかに簡単です。

52
Rob West

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;
    }
}
11
ZafarYousafi