C# AutoMapper:在条件映射中验证后按源值设置目标值

C# AutoMapper: set destination value by source value after validation in conditional mapping

我对 AutoMapper 还很陌生,想知道如何根据不同的源 属性 值将目标成员设置为一个值,如果该值为空,我只想应用默认行为Automapper 的(当源为空时保留目标值)

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

这对 opt.UseDestinationValue() 不起作用(不编译),我可以在这里使用什么选项? 请帮忙

尝试为映射目标设置先决条件 属性。

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

只有当 PropertyB 不为 null 时,才会映射 PropertyA。我确实尝试了一个快速示例,它给出了预期的结果。

我认为您可以使用 PreCondition 选项进行映射 属性

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

希望能帮到你

您可以进行如下操作:

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