2010-10-13 39 views
5

Làm cách nào để ghi đè trình chuyển đổi loại được sử dụng bởi AutoMapper cho một thuộc tính nhất định?Cách chỉ định trình chuyển đổi loại cụ thể cho một thuộc tính cụ thể bằng cách sử dụng AutoMapper

Ví dụ, nếu tôi có:

public class Foo 
{ 
    public string Name { get; set; } 
} 

public class Bar 
{ 
    public string Name { get; set; } 
} 

Bây giờ tôi chỉ muốn để lập bản đồ Foo.Name để Bar.Name nhưng sử dụng một bộ chuyển đổi loại hình quy định. Tôi thấy cách tôi có thể thực hiện việc đó bằng cách sử dụng:

Mapper 
    .CreateMap<Foo,Bar>() 
    .ForMember(x => x.Name, opt => opt.ResolveUsing<FooNameResolver>()); 

Nhưng điều này khó mã hóa chuyển đổi để sử dụng thuộc tính Tên trên Foo. Nếu tôi có cùng kiểu chuyển đổi trên các thuộc tính khác trong lớp này hoặc các lớp khác, tôi phải tạo một lớp trình phân giải cho mỗi thuộc tính.

Và tôi không muốn chỉ định trình chuyển đổi cho chuỗi -> chuỗi do chuyển đổi này là cụ thể cho thuộc tính này hoặc những người khác thích nó.

Tôi chỉ muốn ghi đè trình chuyển đổi loại! Tôi chắc chắn đây phải là tốt nhưng tôi tẩy trống trên nó :-(

tôi là sau khi một cái gì đó như thế này:.

Mapper 
    .CreateMap<Foo,Bar>() 
    .ForMember(x => x.Name, opt => opt.Using<MySpecialStringConverter>()); 

Trả lời

7

tôi đã khám phá ra câu trả lời đọc qua các bài kiểm tra đơn vị cho AutoMapper Đó là không phải là rất rõ ràng, mặc dù giao diện thông thạo, bởi vì rất nhiều các phương pháp trên các tùy chọn bản đồ trả về void Tuy nhiên, ResolveUsing<>() không trả về void nhưng cho phép bạn định thêm tùy chọn đó ẩn nấp giải pháp:..

Mapper 
    .CreateMap<Source,Dest> 
    .ForMember(dest => dest.Name, 
       opt => opt.ResolveUsing<MySpecialStringConverter>() 
          .FromMember(source => source.Name)); 

tôi 'd không muốn chỉ định .FromMember khi thuộc tính là mặc định mà AutoMapper sẽ sử dụng anyway và tất cả những gì tôi muốn sử dụng là ghi đè trình chuyển đổi/giải quyết loại.

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