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

时间:2013-07-23 23:47:07

标签: c# lambda automapper automapper-2

假设我有以下实体(类)

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 go take s.Value2

在我看来,API并没有设计得那么好......但可能是因为我缺乏知识妨碍了。

4 个答案:

答案 0 :(得分:87)

试试这个

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

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

答案 1 :(得分:2)

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

因此,这意味着您无法为同一目标属性定义两个具有不同条件的映射。

如果您的条件类似于&#34;如果条件为真则使用PropertyA,否则使用PropertyB&#34;那么你应该像&#34; Tejal&#34;写道:

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

答案 2 :(得分:2)

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

我正在使用一些枚举条件进行映射,看看对我来说社区的努力。

}

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

答案 3 :(得分:2)

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

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