2016-11-23 63 views
3

我當前的任務需要注意不同對象類型之間的映射,所以我認識到非常好的AutoMapper庫。AutoMapper:使用接口屬性映射對象

到目前爲止容易處理,但這些不同的對象包含複雜的接口類型屬性。讓我告訴你一個代碼片段:

public inferface IInterface 
{ 
    string TextProperty { get; set;} 
} 

public class A : IInterface 
{ 
    string TextProperty { get; set; } 
} 

public class B : IInterface 
{ 
    string TextProperty { get; set; } 
} 


public inferface IComplexInterface 
{ 
    IInterface ComplexProperty { get; set; } 
} 

public class ComplexA : IComplexInterface 
{ 
    IInterface ComplexProperty { get; set; } 
} 

public class ComplexB : IComplexInterface 
{ 
    IInterface ComplexProperty { get; set; } 
} 

在我的情況是可能的類A映射到B類,反之亦然。從A
映射到B是通過從ComplexA類配置CreateMap<A, B>();
映射到ComplexB類沒有問題拋出異常:

錯誤映射類型。

映射類型:

  • 複雜了 - > ComplexB
  • NamespaceOfComplexA.ComplexA - > NamespaceOfComplexB.ComplexB

類型地圖配置:

  • 複雜了 - > ComplexB
  • NamespaceOfComplexA.ComplexA - > NamespaceOfComplexB.ComplexB

物業:

  • ComplexProperty

一個可能的解決方案我已經在這裏找到了計算器可能是一個配置如下:

CreateMap<A, IInterface>().As<B>(); 
CreateMap<B, IInterface>().As<A>(); 

但在我的情況下,它不是工作國王。

有什麼建議嗎?

回答

0

現在,我找到了適合我的解決方案。

我使用AutoMapper與非通用的方法,所以我配置通過:

CreateMap(typeof(ComplexA), typeof(ComplexB)) 

考慮與複雜的類型,如接口,甚至抽象類的屬性,可以寫一個自己的ValueResolver有落實接口:

IValueResolver<object, object, object> 

用下面的方法:

public object Resolve(object source, object destination, object destMember, ResolutionContext context) 
{ 
//... 
} 

要解析接口/抽象類屬性,您可以通過使用ForMember方法增強配置來配置類型(...),並定義了conrete ValueResolver的特定屬性如下:

CreateMap(typeof(ComplexA), typeof(ComplexB)).ForMember("ComplexProperty", x => x.ResolveUsing(new ValueResolver(/*...*/))); 

在我的情況下,它是界面特性映射到具體落實我的類定義的解決方案。

希望它是有用的。