Interface 自动映射:映射具有接口属性的对象
我当前的任务需要注意不同对象类型之间的映射,因此我认识到非常好的AutoMapper库 到目前为止,很容易处理,但这些不同的对象包含复杂的接口类型属性。让我向您展示一段代码片段:Interface 自动映射:映射具有接口属性的对象,interface,automapper,Interface,Automapper,我当前的任务需要注意不同对象类型之间的映射,因此我认识到非常好的AutoMapper库 到目前为止,很容易处理,但这些不同的对象包含复杂的接口类型属性。让我向您展示一段代码片段: public inferface IInterface { string TextProperty { get; set;} } public class A : IInterface { string TextProperty { get; set; } } public class B : II
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
,反之亦然。通过配置
CreateMap(),从类型A
到B
的映射没有问题代码>
从类ComplexA
映射到类ComplexB
会引发异常:
映射类型时出错
映射类型:
- ComplexA->ComplexB
- NamespaceOfComplexA.ComplexA->NamespaceOfComplexB.ComplexB
类型映射配置:
- ComplexA->ComplexB
- NamespaceOfComplexA.ComplexA->NamespaceOfComplexB.ComplexB
财产:
- 复合属性
我在stackoverflow上已经找到的一个可能的解决方案可能是如下配置:
CreateMap<A, IInterface>().As<B>();
CreateMap<B, IInterface>().As<A>();
CreateMap(typeof(ComplexA), typeof(ComplexB)).ForMember("ComplexProperty", x => x.ResolveUsing(new ValueResolver(/*...*/)));
CreateMap().As();
CreateMap().As();
但就我而言,它不起作用
有什么建议吗?现在,我找到了一个适合我的解决方案
我采用非通用方法使用AutoMapper,因此我通过以下方式进行配置:
CreateMap(typeof(ComplexA), typeof(ComplexB))
考虑复杂类型的属性,如接口或抽象类,可以编写自己的ValueSeLover,它必须实现接口:
IValueResolver<object, object, object>
要解析接口/抽象类属性,可以通过使用FormMember(…)方法增强配置来配置类型,并为特定属性定义conrete ValueResolver,如下所示:
CreateMap<A, IInterface>().As<B>();
CreateMap<B, IInterface>().As<A>();
CreateMap(typeof(ComplexA), typeof(ComplexB)).ForMember("ComplexProperty", x => x.ResolveUsing(new ValueResolver(/*...*/)));
在我的例子中,它是将接口属性映射到我的类定义的具体实现的解决方案
希望它有用