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

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


person Castrohenge    schedule 15.03.2010    source источник


Ответы (3)


Функция Ignore() предназначена только для элементов, которые вы никогда не сопоставляете, поскольку эти элементы также пропускаются при проверке конфигурации. Я проверил пару вариантов, но не похоже, что пользовательский преобразователь значений поможет.

Используйте функцию Condition() для сопоставления элемента, когда условие истинно. :

Mapper.CreateMap<CarViewModel, Car>()
 .ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id != 0))
person Jimmy Bogard    schedule 16.03.2010
comment
Каков статус этой функции? Когда мы можем его ожидать? - person mare; 10.04.2010
comment
Это в ночном выпуске. Вы можете найти его на сайте teamcity.codebetter.com. - person Jimmy Bogard; 11.04.2010
comment
@ Джимми Богард, не могли бы вы указать мне ссылку для загрузки Automapper.dll, содержащей эту функцию. На самом деле, мне не удалось найти выпуск этой функции на сайте teamcity.codebetter.com. Спасибо в ожидании за помощь. - person Baig; 16.11.2011
comment
Я был рад, что эта функциональность существует, однако вскоре я понял, что использование ее с условием означает добавление бизнес-логики в раздел сопоставления и что всем нам следует избегать сохранения SoC и SRP. - person Daniel Skowroński; 10.03.2012
comment
Я использую последнюю версию AutoMapper, и метод Skip не существует. - person VikciaR; 17.08.2012
comment
Я тоже этого не вижу, и это очень помогло бы мне в том, что я делаю. - person Eddie; 05.12.2013
comment
Вместо этого это Условие. - person Jimmy Bogard; 05.12.2013
comment
Полезным дополнением к условию было бы следующее: )) - person eriksmith200; 24.09.2018
comment
Это просто условие, вы также должны указать сопоставление. Например, .ForMember(dest=>dest.quantity, opts=>opts.MapFrom(src=>src.Quantity)) .ForMember(dest=>dest.quantity, opts=>opts.Condition(src=>src.Quantity › 0)) Здесь, если Quantity › 0, то Quantity будет установлен на место назначения, иначе оно будет проигнорировано. - person Ikram Shah; 05.12.2018

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

AutoMapper.Mapper.CreateMap().ForMember(dest => dest.Code,config => config.MapFrom(source => source.Id != 0 ? null : source.Code));

person jbehren    schedule 28.04.2011
comment
Хороший обходной путь, которого я сам не видел, но способ Джимми все же лучше. - person alehro; 30.01.2017
comment
Нет, ответ Джимми не соответствует тому, что задает вопрос. Он просто пропускает настройку поля, которое не было настроено. Так что, по сути, ничего не делает. Я не уверен, как кто-то может поднять это так называемое решение. - person jwize; 03.11.2018
comment
Ответ Джимми не сработал для меня, сработал этот. Я думаю, это потому, что я пытался сопоставить источник со сложным объектом, если свойство Id было НЕ 0, например: AutoMapper.Mapper.CreateMap().ForMember(dest => dest.MyObject,config => config.MapFrom(source => source.Id != 0 ? source : null)); - person goku_da_master; 22.05.2019

Вот документация по условному отображению: 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))
person lisandro101    schedule 16.04.2019