C# AutoMapper: установить значение назначения по исходному значению после проверки в условном сопоставлении - PullRequest
0 голосов
/ 30 мая 2020

Я новичок в AutoMapper и хочу знать, как установить для целевого члена значение, основанное на РАЗЛИЧНОМ значении исходного свойства, и если это значение равно null, я просто хочу применить поведение Automapper по умолчанию (сохранить конечное значение когда источник равен нулю)

 CreateMap<ClassA, ClassA>()                   
                    .ForMember(dest => dest.PropertyA, opt =>                             
                            opt.MapFrom(src => src.PropertyB!= null ? null : opt.UseDestinationValue())
                    )

Это не работает (не компилировать) opt.UseDestinationValue () , какой вариант я могу использовать здесь? Пожалуйста, помогите

Ответы [ 3 ]

2 голосов
/ 30 мая 2020

Попробуйте установить предварительное условие для сопоставления свойства назначения.

CreateMap<ClassA, ClassA>().ForMember(dest => dest.PropertyA, opt => opt.PreCondition((src, dest) => src.PropertyB != null));

Это сопоставит PropertyA, только если PropertyB не равно null. Я попробовал быстрый образец, который дал желаемый результат.

1 голос
/ 31 мая 2020

Вы можете сделать следующее:

var configuration = new MapperConfiguration(cfg => {
  cfg.CreateMap<ClassA,ClassA>()
    .ForMember(dest => dest.PropertyA, opt => opt.Condition(src => (src.PropertyB!= null)));
});

Или следующим образом:

var configuration = new MapperConfiguration(cfg => {
  cfg.CreateMap<ClassA,ClassA>()
    .ForMember(dest => dest.PropertyA, opt => {
        opt.PreCondition(src => (src.PropertyB!=null));
        opt.MapFrom(src => src.PropertyB); // mapping process takes place here
    });
});

Но разница в том, что последний запускается раньше в процессе сопоставления.

Есть отличная документация по настройке условий для автомата:

https://docs.automapper.org/en/stable/Conditional-mapping.html

1 голос
/ 30 мая 2020

Думаю, вы можете использовать опцию PreCondition For Mapping Property

        CreateMap<ClassA, ClassA>()
           .ForMember(dest => dest.PropertyA, opt => {
               opt.PreCondition(src => src.PropertyB!= null);
               opt.MapFrom(src => src.PropertyB);
           });

Надеюсь вам помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...