Использование AutoMapper для сопоставления свойства объекта с строкой
У меня есть следующая модель:
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>());
Когда я запускаю приложение, я получаю ошибку:
Пользовательская конфигурация для членов поддерживается только для верхнего уровня отдельных членов по типу.
Что я делаю неправильно?
Ответы
Ответ 1
Это связано с тем, что вы пытаетесь сопоставить фактический тип назначения, а не свойство типа назначения. Вы можете добиться того, чего хотите:
Mapper.CreateMap<Tag, string>().ConvertUsing(source => source.Name ?? string.Empty);
хотя было бы намного проще просто переопределить ToString в классе Tag.
Ответ 2
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;
}
}