Подтвердить что ты не робот

Использование 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>());

Когда я запускаю приложение, я получаю ошибку:

Пользовательская конфигурация для членов поддерживается только для верхнего уровня отдельных членов по типу.

Что я делаю неправильно?

4b9b3361

Ответ 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;
    }
}