使用AutoMapper将对象的属性映射到字符串

44

我有以下模型:

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

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

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

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

当我运行应用程序时,出现以下错误:

仅支持对类型的顶层个人成员进行成员的自定义配置。

我做错了什么?

2个回答

61

这是因为你正在尝试映射到实际目标类型而不是目标类型的属性。你可以使用以下代码实现你的需求:

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

虽然只需在Tag类上覆盖ToString方法会简单得多。


谢谢Rob。我最终采用了你的建议,只是在Tag类上覆盖ToString方法。 - marcusstarnes
谢谢。由于我太幼稚了,本应该使用ConvertUsing()而不是ForMember() - Nate Barbettini

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

这帮助我映射整个实体。我需要将ViewModel映射到Entity,这是正确的方法,谢谢! - jpgrassi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接