【问题标题】:How to configure Conditional Mapping in AutoMapper?如何在 AutoMapper 中配置条件映射?
【发布时间】:2013-07-23 06:31:46
【问题描述】:

假设我有以下实体(类)

public class Target
{
    public string Value;
}


public class Source
{
    public string Value1;
    public string Value2;
}

现在我想配置自动映射,如果 Value1 以“A”开头,则将 Value1 映射到 Value,否则我想将 Value2 映射到 Value。

这是我目前所拥有的:

Mapper
    .CreateMap<Source,Target>()
    .ForMember(t => t.Value, 
        o => 
            {
                o.Condition(s => 
                    s.Value1.StartsWith("A"));
                o.MapFrom(s => s.Value1);
                  <<***But then how do I supply the negative clause!?***>>
            })

然而,我仍然无法理解的部分是如何告诉 AutoMapper 去采取s.Value2 如果之前的条件失败。

在我看来,API 的设计并没有达到应有的水平……但可能是我缺乏知识造成了阻碍。

【问题讨论】:

  • 如果您真的被卡住并且 Tejal 提供的答案并没有解决问题,只需再拨打第二个 ForMember 电话,使用与此条件相反的情况。

标签: c# lambda automapper automapper-2


【解决方案1】:

试试这个

 Mapper.CreateMap<Source, Target>()
        .ForMember(dest => dest.Value, 
                   opt => opt.MapFrom
                   (src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2));

Condition 选项用于向属性添加在映射该属性之前必须满足的条件,而 MapFrom 选项用于执行自定义源/目标成员映射。

【讨论】:

  • 嗯,我实际上也需要一种方法来访问目标值——但这仍然回答了所提出的问题。
  • 你到底想做什么?
  • 条件比描述的要复杂一些,它仅取决于源值。我需要以某种方式获取分辨率上下文并找出目标值。
【解决方案2】:

AutoMapper 允许将条件添加到在映射该属性之前必须满足的属性。

Mapper.CreateMap<Source,Target>()
      .ForMember(t => t.Value, opt => 
            {
                opt.PreCondition(s => s.Value1.StartsWith("A"));
                opt.MapFrom(s => s.Value1);
            })

【讨论】:

  • 您好,欢迎来到 stackoverflow,感谢您的回答。虽然这段代码可能会回答这个问题,但您是否可以考虑添加一些解释来说明您解决了什么问题,以及您是如何解决的?这将有助于未来的读者更好地理解您的答案并从中学习。
  • 最好的办法就是这个答案
【解决方案3】:

使用条件映射,您只能配置何时应为指定的目标属性执行映射。

所以这意味着您不能为同一个目标属性定义两个具有不同条件的映射。

如果您有类似“如果条件为真则使用 PropertyA 否则使用 PropertyB”之类的条件,那么您应该像“Tejal”这样写:

opt.MapFrom(src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2)

【讨论】:

    【解决方案4】:

    AutoMapper 允许您向属性添加在映射该属性之前必须满足的条件。

    我正在使用一些枚举条件进行映射,看看这对我来说对社区来说几乎没有什么努力。

    }

    .ForMember(dest => dest.CurrentOrientationName, 
                 opts => opts.MapFrom(src => src.IsLandscape? 
                                            PageSetupEditorOrientationViewModel.Orientation.Landscape : 
                                            PageSetupEditorOrientationViewModel.Orientation.Portrait));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多