2011-11-04 53 views
5

問題 看起來像條件​​被忽略。這是我的情景:自動映射器的狀態被忽略

源類

public class Source 
{ 
    public IEnumerable<Enum1> Prop1{ get; set; } 

    public IEnumerable<Enum2> Prop2{ get; set; } 

    public IEnumerable<Enum3> Prop3{ get; set; } 
} 

從一個字節的枚舉子類,然後用[標誌]裝飾。目標類只包含Enum1,Enum2和Enum3等屬性,包含「總」位值。所以在本質上,如果Enumeration包含Enum1.value!,Enum1.Value2和Enum1.Value3,則目標將包含Enum1.Value1 | Enum1.Value2 |當內屬性非空值和映射成功和正確地設定目的地Enum1.Value3

目的類

public Enum1 Prop1 { get; set; } 

    public Enum2 Prop2 { get; set; } 

    public Enum3 Prop3 { get; set; } 

AutoMapper映射

Mapper.CreateMap<Source, Destination>() 
      .ForMember(m => m.Prop1, o => 
       { 
        o.Condition(c => !c.IsSourceValueNull); 
        o.MapFrom(f => f.Prop1.Aggregate((current, next) => current | next)); 
       }) 
      .ForMember(m => m.Prop2, o => 
      { 
       o.Condition(c => !c.IsSourceValueNull); 
       o.MapFrom(f => f.Prop2.Aggregate((current, next) => current | next)); 
      }) 
      .ForMember(m => m.Prop3, o => 
      { 
       o.Condition(c => !c.IsSourceValueNull); 
       o.MapFrom(f => f.Prop3.Aggregate((current, next) => current | next)); 
      }); 

映射工作正常。但是,當成員源值爲空(當Prop1爲null時,則跳過映射)時,我想跳過映射。

我可以從調試中看到Source.Prop1爲空。條件完全被忽略,並得到異常說值爲空。

Trying to map Source to Destination. Destination property: Prop1. Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. --> Value cannot be null. Parameter name: source 

我不確定是否IsSourceValueNull檢查Prop1或實際的Source類不是null。只有成員Prop1爲空。

任何幫助isappreciated。

回答

6

我認爲你需要做的ConditionMapFrom兩個步驟:如果條件計算結果爲假

.ForMember(c => c.Prop1, o => o.Condition(c => !c.IsSourceValueNull)); 
.ForMember(c => c.Prop1, o => o.MapFrom(f => f.Prop1.Aggregate(...)); 

的MapFrom將永遠不會被使用。

編輯

嗯...這似乎並沒有工作。我以爲我曾經在某個地方使用過。你可以求助於MapFrom:

.MapFrom(f => f.Prop1 == null ? null : f.Prop1.Aggregate(...)); 
+0

謝謝帕特里克。通過分離出來,我可以得到完全相同的例外。 – TimJohnson

+0

我以爲我以前做過。一種可能的情況是,c.IsSourceValueNull可能表示整個要映射的源對象是否爲空。我想知道它應該是「c => c.Prop1!= null」? – PatrickSteele

+0

使用「條件」找不到代碼示例。抱歉。我想你總是可以這樣做:o.MapFrom(f => f.Prop1 == null?null:f.Prop1.Aggregate(...)) – PatrickSteele

2

IMO,這實際上是AutoMapper的EnumMapper中的一個錯誤。條件聲明,正如你在上面所說的那樣,應該可以正常工作。例如,當映射從一個具體類型到另一個TypeMapMapper將正確調用條件:

object mappedObject = !context.TypeMap.ShouldAssignValue(context) ? null : mapperToUse.Map(context, mapper); 

最終調用defined condition

public bool ShouldAssignValue(ResolutionContext context) 
    { 
     return _condition == null || _condition(context); 
    } 

EnumMapper不調用類型映射的ShouldAssignValue方法以確定它是否確實應該映射該領域。同樣,我沒有看到AfterMap的任何提及,所以這裏定義的任何東西都不可能發揮作用。

+0

作爲問題#143提交一個測試用例: https://github.com/AutoMapper/AutoMapper/issues/143 –

+0

謝謝。這就說得通了。 – TimJohnson