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

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

Пока единственное решение, которое у меня есть, это использовать две разные модели представлений и создавать разные сопоставления для каждой.

4b9b3361

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