2017-09-28 37 views
0

我使用自动映射器6.1,并且我想将某个值从一个对象映射到另一个对象,但是有一个条件,那些值不能为空,并且不是所有的对象属性都应该映射我可以轻松使用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); 

回答

1

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

0

如果我理解正确的话,它可能比你想象的更简单。 opt.Condition不是必需的,因为条件已在MapFrom中处理。

我认为以下应该达到你想要的:它将映射Branch,如果它不是null。如果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; 
    } 
} 
+0

如果我想从x而不是字符串空值的值。 –

+0

@WojciechSzabowicz,我编辑我的回复添加2个更多的例子。希望能帮助到你。 –