2013-06-21 44 views
7

Tôi mới sử dụng Automapper, vì vậy tôi không chắc liệu điều này có thể thực hiện được hay không.Có thể Automapper bỏ qua các phương thức void không?

Tôi muốn ánh xạ một lớp, nhưng làm cho nó bỏ qua các phương thức bị vô hiệu. Dưới đây là minh họa cho mã tôi có. Khi tôi chạy nó, tôi nhận được thông báo ngoại lệ sau.

Một ngoại lệ unhandled của loại 'AutoMapper.AutoMapperMappingException' xảy ra ở AutoMapper.dll

Đáng tiếc là nó không phải là một lựa chọn để thay đổi giao diện, vì vậy tôi giả định nếu điều này là có thể có một số loại cấu hình tôi đang thiếu?

public interface IThing 
{ 
    string Name { get; set; } 
    void IgnoreMe(); 
} 

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

    public void IgnoreMe() 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var fooSource = new Foo {Name = "Bobby"}; 
     Mapper.CreateMap<IThing, IThing>(); 

     var fooDestination = Mapper.Map<IThing>(fooSource); 
     Console.WriteLine(fooDestination.Name); 
     Console.ReadLine(); 
    } 
} 
+0

Bạn có thể dùng lệnh 'ConstructUsing' để xác định thực hiện Automapper nên tạo:' Mapper.CreateMap (). ConstructUsing ((ResolutionContext c) => new Foo()); ' – nemesv

+0

@nemesv cảm ơn, đã hoạt động! –

+0

Bằng cách bạn đang sử dụng 'IThing' làm loại đích? Bởi vì 'Mapper.CreateMap ();' cũng sẽ hoạt động ... – nemesv

Trả lời

7

Nếu bạn đang sử dụng an interface as a destination, kiểu AutoMapper sẽ tự động tạo loại triển khai (proxy) cho bạn.

Tuy nhiên, thế hệ proxy chỉ hỗ trợ các thuộc tính, do đó, nó ném ngoại lệ này không quá mô tả cho phương thức IgnoreMe của bạn. Vì vậy, bạn không thể bỏ qua phương thức IgnoreMe của mình.

Để giải quyết sự cố, bạn có thể chỉ định rõ cách đối tượng đích sẽ được xây dựng bằng cách sử dụng một trong các quá tải ConstructUsing trong trường hợp này AutoMapper không tạo proxy.

Mapper.CreateMap<IThing, IThing>() 
     .ConstructUsing((ResolutionContext c) => new Foo()); 

Hoặc nếu bạn không có lý do chính đáng, bạn có thể ánh xạ trực tiếp đến Foo

Mapper.CreateMap<IThing, Foo>(); 
Các vấn đề liên quan