2011-12-06 95 views
20

我使用Automapper將值從一個實例複製到另一個實例,並且我發現如果該類具有數組屬性,並且源實例具有該屬性設置爲null,Automapper將目標屬性設置爲零長度數組而不是null,正如我所料。Automapper將數組屬性設置爲零長度數組而不是null

當源代碼爲null時,有沒有辦法配置Automapper將目標設置爲null

如果我的解釋是不清楚的,下面的代碼說明了什麼,我試圖描述:

public class Test 
{ 
    public byte[] ByteArray { get; set; } 
    public int? NullableInt { get; set; } 
    public int Int { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Mapper.CreateMap<Test, Test>(); 

     var test1 = new Test { Int = 123, NullableInt = null, ByteArray = null }; 
     var test2 = Mapper.Map<Test>(test1); 

     // test1: Int == 123, NullableInt == null, ByteArray == null 
     // test2: Int == 123, NullableInt == null, ByteArray == byte[0] <-- expect this to be null 
    } 
} 

回答

35

我發現這已經報告爲issue,並添加了一個新的配置選項(請參閱此commit)。這時,選擇不通過的NuGet可釋放,但我能想出一個辦法來處理,直到下一個版本發佈:

Mapper.CreateMap<Test, Test>() 
    .ForMember(t => t.ByteArray, opt => opt.ResolveUsing(t => t.ByteArray == null ? null : t.ByteArray)); 

更新:

隨着版本2.1.265.0的,你可以使用AllowNullCollections屬性:

Mapper.Configuration.AllowNullCollections = true; 
Mapper.CreateMap<Test, Test>(); 
+2

感謝您的更新! – hB0

+0

它似乎並沒有在全球範圍內發揮作用。 – DonO

0

我認爲這僅僅是使用的源和目標類型完全相同的一個怪癖。如果你真的把它們變成了不同的類型,那麼字節數組就會變爲空。

+0

我認爲同樣的,並創建了一個類'Target',相同的屬性'Test',映射'Test'到'Target'和數組屬性仍然在g設置爲一個零長度數組。 –

+0

什麼版本的Automapper - 1.x或2.x?我認爲我在2.x下測試,我的目標類爲byte []獲得了空值。 – PatrickSteele

+0

2.0 - 從NuGet下載的版本 –