2016-11-23 136 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(/*...*/))); 

在我的情况下,它是界面特性映射到具体落实我的类定义的解决方案。

希望它是有用的。