如何在AutoMapper中配置条件映射?

Alw*_*wyn 40 c# lambda automapper automapper-2

假设我有以下实体(类)

public class Target
{
    public string Value;
}


public class Source
{
    public string Value1;
    public string Value2;
}
Run Code Online (Sandbox Code Playgroud)

现在我想配置自动映射,如果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!?***>>
            })
Run Code Online (Sandbox Code Playgroud)

然而,我仍然不知道的部分是如果在早期条件失败时告诉AutoMapper 采取s.Value2措施.

在我看来,API的设计并不像它可能......但可能是我缺乏知识妨碍了.

Tej*_*jal 89

试试这个

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

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

  • 嗯,我实际上也需要一种以某种方式访问​​目标值的方法 - 但这仍然回答了所提出的问题。 (2认同)

Bas*_*sim 5

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

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

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