44

我有以下模型:

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我希望能够使用 AutoMapper 将类型的Name属性映射Tag到我的一个视图模型中的字符串属性。

我创建了一个自定义解析器来尝试处理此映射,使用以下代码:

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 回答