成员条件的自动映射器

Automapper for member condition

我正在使用自动映射器 6.1,我想将一些值从一个对象映射到另一个对象,但有一个条件,即这些值不能为 null,并且如果可以的话,并非所有对象属性都应该被映射轻松使用 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);

如果我没有理解错的话,它可能比你想象的要简单。 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;
    }
}

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