AutoMapper:使用接口属性映射对象

时间:2016-11-23 09:42:24

标签: interface 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来,从BCreateMap<A, B>();的映射没有问题 从类ComplexA到类ComplexB的映射会引发异常:

  

映射类型时出错。

映射类型:

  • ComplexA - &gt; ComplexB
  • NamespaceOfComplexA.ComplexA - &gt; NamespaceOfComplexB.ComplexB

输入地图配置:

  • ComplexA - &gt; ComplexB
  • NamespaceOfComplexA.ComplexA - &gt; NamespaceOfComplexB.ComplexB

属性:

  • ComplexProperty

我在stackoverflow上找到的一个可能的解决方案可能是如下配置:

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

但在我的情况下它不起作用。

有什么建议吗?

1 个答案:

答案 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(/*...*/)));

在我的例子中,它是将接口属性映射到我的类定义的具体实现的解决方案。

希望它有用。