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

问题描述 投票:0回答:3

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

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

这样做是行不通的(不要编译)。opt.UseDestinationValue() ,我可以在这里使用什么选项?请帮忙

c# automapper
3个回答
2
投票

尝试设置一个映射目标属性的前提条件。

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

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


1
投票

我认为你可以使用PreCondition选项为映射属性。

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

希望能帮到你


1
投票

你可以按以下方式进行。

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

但不同的是,后者在映射过程中运行得更快。

在为automapper设置条件方面,有一个很好的文档。

https:/docs.automapper.orgenstableConditional-mapping.html。

© www.soinside.com 2019 - 2024. All rights reserved.