2013-01-31 37 views
5

Tôi có đoạn mã sau đây.Automapper DynamicMap không lập bản đồ Danh sách các loại ẩn danh

var files = query.ToList(); 
var testFile = Mapper.DynamicMap<EftFileDto>(files.First()); 
var filesDto = Mapper.DynamicMap<List<EftFileDto>>(files); 

testFile có giá trị được ánh xạ chính xác, nhưng tệpĐể trống.

Dường như dynamicMap hoạt động trên các mục riêng lẻ, chứ không phải danh sách?

files là Danh sách các đối tượng ẩn danh.

EDIT: Nó cũng không hoạt động nếu tôi sử dụng Mảng. Tôi có thể lấy nó để làm việc, nhưng ...

 var filesDto = query.Select(Mapper.DynamicMap<EftFileDto>).ToList(); 
+0

Có thể kiểm tra các giải pháp sau đây: http://stackoverflow.com/ a/5978050/1241400 –

+0

@plurby, không áp dụng, vì câu hỏi đó liên quan đến hai loại đã biết, tôi có danh sách loại ẩn danh, vì vậy tôi cần sử dụng 'DynamicMap' thay vì' Map' – CaffGeek

+0

Tôi đã kiểm tra và nó hoạt động khi bạn sử dụng query.Select (Mapper.DynamicMap ) .ToList(); cú pháp. Bạn có thể cung cấp mã cho truy vấn và DTO của bạn để chúng tôi có thể giúp bạn giải quyết vấn đề không? –

Trả lời

7

Trong hầu hết các tình huống lập bản đồ, chúng ta đều biết các loại chúng tôi đang lập bản đồ để ở thời gian biên dịch. Trong một số trường hợp, loại nguồn không được biết cho đến khi thời gian chạy là , đặc biệt là trong các trường hợp tôi đang sử dụng các loại động hoặc trong các trường hợp có thể mở rộng là .

Cuộc gọi DynamicMap tạo cấu hình cho loại đối tượng nguồn được chuyển đến loại đích được chỉ định. Nếu hai loại đã được lập bản đồ, AutoMapper sẽ bỏ qua bước này (vì tôi có thể gọi Bản đồ động nhiều lần cho ví dụ này).

Nguồn: http://lostechies.com/jimmybogard/2009/04/15/automapper-feature-interfaces-and-dynamic-mapping/

ngắn hơn phiên bản: DynamicMap cũng giống như gọi CreateMap sau đó Bản đồ.

Một số Person lớp giả

phép nói rằng bạn có một danh sách của Người.

var persons = new List<Person>(); 
for (int i = 0; i < 100; i++) 
{ 
     persons.Add(new Person { 
       Name = String.Format("John {0}", i), 
       Surname = String.Format("Smith {0}", i), 
       Age = i }); 
} 

Sau đó, bạn chọn một người thêm thuộc tính mới.

var anonymousTypes = persons.Select(p => new { 
      p.Name, 
      p.Surname, 
      FullName = String.Format("{0}, {1}", p.Surname,p.Name) }).ToList(); 

Để có được đúng ánh xạ là người đầu tiên

var testFile = Mapper.DynamicMap<Person>(anonymousTypes.First()); 

Để có được đúng ánh xạ tất cả những người bạn sẽ sử dụng

var testFiles = anonymousTypes.Select(Mapper.DynamicMap<Person>).ToList(); 
+1

Bạn vừa trả lời bằng giải pháp tôi đã đăng trong Chỉnh sửa của mình. Vấn đề là tôi không cần phải sử dụng '.Select' để ánh xạ từng mục riêng lẻ, tôi sẽ có thể ánh xạ nó như một bộ sưu tập với' Mapper.DynamicMap (files); danh sách không.Vì vậy, biết cấu trúc của Dto không quan trọng, vì một mục duy nhất ánh xạ chính xác. – CaffGeek

+0

Tôi biết, tôi vừa cung cấp một thử nghiệm để xem nó có hoạt động không. Nếu bạn tìm thấy nó một vấn đề đăng nó hoặc thực hiện một yêu cầu kéo trên trang dự án. Tại sao nó làm phiền bạn sử dụng Select()? –

+1

Có vẻ như hackish, và tôi tò mò tại sao nó không làm việc như nó có vẻ như nó nên. – CaffGeek

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