我当前的任务需要注意不同对象类型之间的映射,所以我认识了非常好的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
到CreateMap<A, B>();
的映射没有问题
从类ComplexA
到类ComplexB
的映射会引发异常:
映射类型时出错。
映射类型:
输入地图配置:
属性:
我在stackoverflow上找到的一个可能的解决方案可能是如下配置:
CreateMap<A, IInterface>().As<B>();
CreateMap<B, IInterface>().As<A>();
但在我的情况下它不起作用。
有什么建议吗?
答案 0 :(得分: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(/*...*/)));
在我的例子中,它是将接口属性映射到我的类定义的具体实现的解决方案。
希望它有用。