【问题标题】:Automapper for member condition成员条件的自动映射器
【发布时间】:2017-09-28 09:46:06
【问题描述】:

我正在使用自动映射器 6.1,我想将一些值从一个对象映射到另一个对象,但有一个条件是这些值不能为空,并且如果我可以轻松使用,则并非所有对象属性都应该被映射ForAllMembers 条件。我想做的是:

   config.CreateMap<ClassA, ClassB>()
     .ForMember(x => x.Branch, opt => opt.Condition(src => src.Branch != null), 
        cd => cd.MapFrom(map => map.Branch ?? x.Branch))

也试过了

 config.CreateMap<ClassA, ClassB>().ForMember(x => x.Branch, cd => {
   cd.Condition(map => map.Branch != null);
   cd.MapFrom(map => map.Branch);
 })

换句话说,对于我在自动映射器配置中定义的每个属性,我想检查它是否为空,如果它为空,则从 x 中离开值。

调用此类自动映射器配置如下所示:

 ClassA platform = Mapper.Map<ClassA>(classB);

【问题讨论】:

    标签: c# automapper-6


    【解决方案1】:

    如果我理解正确,它可能比你想象的要简单。 opt.Condition 不是必需的,因为MapFrom 中已经处理了该条件。

    我认为以下内容应该可以实现您想要的:如果不是null,它将映射Branch。如果Branch(来自源)是null,那么它会将目标设置为string.Empty

    config.CreateMap<ClassA, Class>()
        .ForMember(x => x.Branch, cd => cd.MapFrom(map => map.Branch ?? string.Empty));
    

    如果你需要使用 x 中的另一个属性而不是 string.Empty,那么你可以这样写:

    config.CreateMap<ClassA, Class>()
        .ForMember(x => x.Branch, cd => cd.MapFrom(map => map.Branch ?? x.AnotherProperty));
    

    如果您想实现复杂的逻辑但保持映射整洁,您可以将您的逻辑提取到一个单独的方法中。例如:

    config.CreateMap<ClassA, Class>()
            .ForMember(x => x.Branch, cd => cd.MapFrom(map => MyCustomMapping(map)));
    
    private static string MyCustomMapping(ClassA source)
    {
        if (source.Branch == null)
        {
            // Do something
        }
        else
        {
            return source.Branch;
        }
    }
    

    【讨论】:

    • 如果我想要一个来自 x 的值而不是空字符串怎么办。
    • @WojciechSzabowicz,我编辑了我的回复以添加另外 2 个示例。希望对您有所帮助。
    • @AlexSanséau 该代码永远不会将目标设置为string.Empty,因为如果ClassA.Branch 为空,则不会映射该字段。这是默认的 AutoMapper 行为。仅当Class 的默认构造函数以这种方式初始化时,Branch 才会有 string.Empty 的值。
    【解决方案2】:

    您不需要 MapFrom,但您需要一个 PreCondition。见here

    【讨论】:

    • 我很想看到已接受的答案,但链接已失效 :( 请在此处添加答案。
    • 更新了链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多