53

假设我有以下实体(类)

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 的设计并不像它可能的那样好……但可能是我缺乏知识造成了阻碍。

4

4 回答 4

106

尝试这个

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

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

于 2013-07-24T05:16:58.727 回答
7

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

Mapper.CreateMap<Source,Target>()
      .ForMember(t => t.Value, opt => 
            {
                opt.PreCondition(s => s.Value1.StartsWith("A"));
                opt.MapFrom(s => s.Value1);
            })
于 2020-02-18T08:47:55.397 回答
4

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

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

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

opt.MapFrom(src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2)
于 2015-11-05T11:17:53.467 回答
2

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

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

}

.ForMember(dest => dest.CurrentOrientationName, 
             opts => opts.MapFrom(src => src.IsLandscape? 
                                        PageSetupEditorOrientationViewModel.Orientation.Landscape : 
                                        PageSetupEditorOrientationViewModel.Orientation.Portrait));
于 2016-09-02T12:55:22.470 回答