Automapper: игнорировать при условии
Можно ли игнорировать сопоставление члена в зависимости от значения свойства источника?
Например, если у нас есть:
public class Car
{
public int Id { get; set; }
public string Code { get; set; }
}
public class CarViewModel
{
public int Id { get; set; }
public string Code { get; set; }
}
Я ищу что-то вроде
Mapper.CreateMap<CarViewModel, Car>()
.ForMember(dest => dest.Code,
opt => opt.Ignore().If(source => source.Id == 0))
Пока единственное решение, которое у меня есть, это использовать две разные модели представлений и создавать разные сопоставления для каждой.
Ответы
Ответ 1
Функция Ignore() предназначена исключительно для участников, которые вы никогда не отображаете, поскольку эти элементы также пропускаются при проверке конфигурации. Я проверил несколько вариантов, но это не похоже на то, что пользовательский преобразователь значений сработает.
Используйте функцию Condition() для сопоставления члена, когда условие выполняется:
Mapper.CreateMap<CarViewModel, Car>()
.ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id != 0))
Ответ 2
У меня возникла аналогичная проблема, и хотя это заменит существующее значение для dest.Code
на null, это может быть полезно в качестве отправной точки:
AutoMapper.Mapper.CreateMap().ForMember(dest => dest.Code,config => config.MapFrom(source => source.Id != 0 ? null : source.Code));
Ответ 3
Вот документация условного отображения: http://docs.automapper.org/en/latest/Conditional-mapping.html
Есть также другой метод, называемый PreCondition, который очень полезен в определенных сценариях, поскольку он запускается до разрешения исходного значения в процессе отображения:
Mapper.PreCondition<CarViewModel, Car>()
.ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id == 0))