2011-12-06 35 views
20

Tôi đang sử dụng Automapper để sao chép giá trị từ phiên bản này sang thể hiện khác và tôi thấy rằng nếu lớp có thuộc tính mảng và thể hiện nguồn đã thuộc tính được đặt thành null, Automapper đặt thuộc tính đích thành mảng không có độ dài thay vì null như tôi mong đợi.Automapper đặt thuộc tính mảng thành mảng không độ dài thay vì null

Có cách nào để định cấu hình Automapper để đặt đích đến null khi nguồn là null không?

Trong trường hợp giải thích của tôi là không rõ ràng, đoạn code sau minh họa những gì tôi đang cố gắng để mô tả:

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 
    } 
} 

Trả lời

35

Tôi thấy rằng điều này đã được báo cáo là issue và tùy chọn cấu hình mới đã được thêm (xem số commit) này. Tại thời điểm này, tùy chọn không có trong các phiên bản có sẵn thông qua NuGet, nhưng tôi đã có thể tìm ra một cách để xử lý này cho đến khi phiên bản tiếp theo được phát hành:

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

Cập nhật:

tính đến phiên bản 2.1.265.0, bạn có thể sử dụng AllowNullCollections tài sản:

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

Cảm ơn bạn đã cập nhật! – hB0

+0

Nó dường như không hoạt động ở cấp độ toàn cầu. – DonO

0

Tôi nghĩ rằng đây chỉ là một điều không minh bạch từ việc sử dụng các loại chính xác tương tự cho cả hai nguồn và đích. Nếu bạn thực sự tạo ra các kiểu khác nhau, mảng byte đi qua là null.

+0

tôi nghĩ giống nhau, và tạo ra một lớp 'Target', cùng tính chất như 'test', ánh xạ' test' cho 'Target' và mảng tài sản vẫn còn bein g đặt thành một mảng có độ dài bằng không. –

+0

Phiên bản nào của Automapper - 1.x hoặc 2.x? Tôi nghĩ rằng tôi đã thử nghiệm dưới 2.x và lớp đích của tôi có một null cho byte []. – PatrickSteele

+0

2.0 - phiên bản tải xuống từ NuGet –

Các vấn đề liên quan