2017-09-28 94 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個更多的例子。希望能幫助到你。 –