2012-06-25 24 views
27

tôi có mô hình sau:Sử dụng AutoMapper để lập bản đồ thuộc tính của một đối tượng vào một chuỗi

public class Tag 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Tôi muốn để có thể sử dụng AutoMapper để lập bản đồ Name tài sản của các loại Tag để sở hữu một chuỗi trong một trong các chế độ xem của tôi.

tôi đã tạo ra một phân giải tùy chỉnh để cố gắng xử lý bản đồ này, sử dụng đoạn mã sau:

public class TagToStringResolver : ValueResolver<Tag, string> 
    { 
     protected override string ResolveCore(Tag source) 
     { 
      return source.Name ?? string.Empty; 
     } 
    } 

Tôi đang lập bản đồ bằng cách sử dụng đoạn mã sau:

Mapper.CreateMap<Tag, String>() 
    .ForMember(d => d, o => o.ResolveUsing<TagToStringResolver>()); 

Khi tôi chạy các ứng dụng tôi gặp lỗi:

Custom configuration for members is only supported for top-level individual members on a type.

Tôi đang làm gì sai?

Trả lời

40

Điều này là do bạn đang cố gắng để ánh xạ các loại đích thực sự chứ không phải là tài sản của các loại đích. Bạn có thể đạt được những gì bạn muốn với:

Mapper.CreateMap<Tag, string>().ConvertUsing(source => source.Name ?? string.Empty); 

mặc dù sẽ đơn giản hơn rất nhiều chỉ để ghi đè ToString trên lớp Thẻ.

+0

Cảm ơn Rob. Tôi đã kết thúc với đề xuất của bạn chỉ đơn giản là ghi đè ToString trên lớp Tag. – marcusstarnes

+0

Cảm ơn vì điều này. Tôi đã sử dụng 'ForMember()' khi tôi nên sử dụng 'ConvertUsing()'. –

9

ForMember có nghĩa là bạn đang cung cấp ánh xạ cho thành viên nơi bạn muốn ánh xạ giữa loại. Thay vào đó, sử dụng này:

Mapper.CreateMap<Tag, String>().ConvertUsing<TagToStringConverter>(); 

Và Converter là

public class TagToStringConverter : ITypeConverter<Tag, String> 
{ 
    public string Convert(ResolutionContext context) 
    { 
     return (context.SourceValue as Tag).Name ?? string.Empty; 
    } 
} 
+0

Điều này đã giúp tôi lập bản đồ toàn bộ thực thể. Tôi đã phải lập bản đồ một ViewModel cho một thực thể, và đây là con đường để đi, cảm ơn! – jpgrassi

+0

Tính năng rất hay, thx Patrick! –