AutoMapper: сопоставление целевого свойства с другим исходным свойством/типом на основе некоторой логики.

Я хочу сопоставить исходный объект с целевым объектом, который имеет некоторые дополнительные свойства, которые не эквивалентны напрямую исходным свойствам. Рассмотрим пример ниже:

class Source { string ImageFilePath; }

class Destination { bool IsFileSelected; bool IsFileGif; }

Логика сопоставления для IsFileGif:

destinationObj.IsFileGif = Path.GetExtension(sourceObj.ImageFilePath) == ".gif" ? true : false;

Логика сопоставления для IsFileSelected:

destinationObj.IsFileSelected = string.IsNullOrEmpty(sourceObj.ImageFilePath) ? false : true;

Кроме того, поскольку моим источником является IDataReader, я хотел бы знать, как сопоставить поле/столбец объекта IDataReader с моим свойством Destination.

Можем ли мы добиться этого с помощью встроенного кода или для этого нужно использовать преобразователи значений?


person Lucifer    schedule 17.03.2015    source источник


Ответы (2)


Вы пробовали использовать метод MapFrom?

Mapper.CreateMap<Source , Destination>()
 .ForMember(dest => dest.IsFileGif, opt => opt.MapFrom(src => Path.GetExtension(sourceObj.ImageFilePath) == ".gif")
 .ForMember(dest => dest.IsFileSelected, opt =>  opt.MapFrom(src => !string.IsNullOrEmpty(sourceObj.ImageFilePath));

Что касается IDataReader, я думаю, вы должны сопоставлять свои классы (от источника к месту назначения), а не от IDataReader к месту назначения...

person Leandro Gomide    schedule 17.03.2015
comment
Спасибо @Igomide, метод MapFrom сработал. Класс Source использовался просто для простоты. В моем реальном сценарии источником на самом деле является IDataReader, созданный из объекта DataTable, извлеченного из базы данных. И я написал общий метод расширения, который будет выполнять сопоставление IDataReader -> IEnumerable‹T›. - person Lucifer; 17.03.2015

Я выяснил сопоставление IDataReader с объектом Destination:

Mapper.CreateMap<IDataReader, Destination>()
                    .ForMember(d => d.IsFileSelected,
                         o => o.MapFrom(s => !string.IsNullOrEmpty(s.GetValue(s.GetOrdinal("ImageFilePath")).ToString())))
                    .ForMember(d => d.IsFileGif,
                         o => o.MapFrom(s => Path.GetExtension(s.GetValue(s.GetOrdinal("ImageFilePath")).ToString()) == ".gif"));

Был бы признателен, если бы кто-нибудь проверил этот код или предложил лучшую альтернативу.

person Lucifer    schedule 17.03.2015