2010-03-07 6 views
6

Tôi vừa bắt đầu sử dụng AutoMapper và cho đến nay tìm thấy nó rất thẳng về phía trước và tiết kiệm thời gian.Lập bản đồ tất cả các thuộc tính của loại 'X' với AutoMapper

Chỉ một điều tôi không chắc chắn về - làm cách nào để ánh xạ tất cả các thuộc tính của một loại nhất định theo cùng một cách?

Điều này có thể được thực hiện với AutoMapper trong một câu lệnh duy nhất, sử dụng lambda, như với ánh xạ thông thường không?

+2

dùng thử http://valueinjecter.codeplex.com/ này, nó được thiết kế để ánh xạ từ tất cả các đạo cụ của một loại cụ thể đến một loại khác ở nơi đầu tiên – Omu

+1

Cảm ơn vì @Omu đó. Tại sao bạn không thêm câu trả lời đó làm Câu trả lời? – Jonathan

Trả lời

5

Điều bạn đang tìm kiếm được gọi là CustomTypeConverter. Đây là phạm vi toàn cục trong phạm vi và chỉ cần được định cấu hình một lần.

Cú pháp là:

Mapper.CreateMap<TSourceProperty,TDestinationProperty>().ConvertUsing(argument); 

nơi argument có thể

  1. An thực hiện ITypeConverter<TSourceProperty,TDestinationProperty>
  2. Một Func<TSourceProperty,TDestinationProperty>

Jimmy Bogard có một bài viết về thực hiện CustomTypeConverter s tại http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/05/automapper-feature-custom-type-converters.aspx.

Thông tin khác cũng được cung cấp trong số CustomTypeConverter page of the AutoMapper documentation.

Ồ, và nhân tiện (vì tôi muốn tiền thưởng của Omu), bạn cũng có thể thực hiện việc này bằng cách chuyển sang giá trị.

+0

nó không thực sự giống nhau, nếu bạn cần các thuật toán khác nhau để chuyển đổi từ int sang Foo cho nhiều ánh xạ hơn (có thể bạn sẽ phải gọi CreateMap mỗi lần trước khi ánh xạ), hoặc nếu bạn cần bản đồ từ tất cả các kiểu kế thừa cơ sở lớp để int, làm thế nào bạn sẽ làm điều đó – Omu

+0

Bạn chỉ cần một cuộc gọi duy nhất để 'CreateMap' cho mỗi trường hợp ứng dụng. Nếu bạn cần làm cho 'int' map thành' Foo' khác nhau trong các ngữ cảnh khác nhau, thì bạn nên khai báo nó như là một ánh xạ dựa trên đặc tính thay vì ánh xạ dựa trên kiểu. Trong những trường hợp này, bạn có thể sử dụng [Giải pháp giá trị tùy chỉnh] (http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers&referringTitle=Home) để chỉ định các ánh xạ 'int' thành' Foo' phức tạp và chỉ cần thực hiện khai báo 'Mapper.CreateMap (). ForMember (dest => dest.Total, opt => opt.ResolveUsing ());' – smartcaveman

+0

@Omu, để ánh xạ tất cả các kiểu kế thừa một số lớp cơ sở, bạn có thể sử dụng sự phản chiếu để có được tất cả các kiểu có nguồn gốc và sau đó lặp qua chúng và gọi 'CreateMap'. Điều này có thể tốn kém và có lẽ nên được thực hiện trong cấu hình IoC của bạn, nhưng cuộc gọi tĩnh sẽ trông giống như 'void MapSubTypes () {foreach (var subType trong AppDomain.CurrentDomain.GetAssemblies(). SelectMany (a = Trường hợp (t => typeof (TBase) .IsAssignableFrom (t)))) {Mapper.CreateMap (subType, typeof (TDestination));} '. Hãy tha thứ cho tôi nếu tôi tạo lỗi cú pháp - khó có thể viết mã trong hộp nhận xét – smartcaveman