44

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

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

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

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

私は何が間違っているのですか?

4

2 に答える 2

61

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

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

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

于 2012-06-25T14:37:01.657 に答える
16

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;
    }
}
于 2012-06-25T14:36:34.877 に答える