【问题标题】:AutoMapper: Mapping objects with interface propertiesAutoMapper:使用接口属性映射对象
【发布时间】:2017-04-07 05:53:01
【问题描述】:

我当前的任务需要注意不同对象类型之间的映射,因此我认识到了非常好的 AutoMapper 库。

到目前为止很容易处理,但这些不同的对象包含复杂的接口类型属性。让我给你看一个代码sn-p:

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>();A类型映射到B是没有问题的
ComplexA 类映射到 ComplexB 类会引发异常:

错误映射类型。

映射类型:

  • 复合体A -> 复合体B
  • NamespaceOfComplexA.ComplexA -> NamespaceOfComplexB.ComplexB

类型映射配置:

  • 复合体A -> 复合体B
  • NamespaceOfComplexA.ComplexA -> NamespaceOfComplexB.ComplexB

属性:

  • 复杂属性

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

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

但就我而言,它不起作用。

有什么建议吗?

【问题讨论】:

    标签: interface automapper


    【解决方案1】:

    现在,我找到了适合我的解决方案。

    我将 AutoMapper 与非通用方法一起使用,因此我通过以下方式进行配置:

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

    要考虑具有复杂类型(如接口甚至抽象类)的属性,可以编写自己的 ValueResolver 来实现接口:

    IValueResolver<object, object, object>
    

    使用以下方法:

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

    要解析接口/抽象类属性,您可以通过使用 ForMember(...) 方法增强配置来配置您的类型,并为特定属性定义一个具体的 ValueResolver,如下所示:

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

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

    希望有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      相关资源
      最近更新 更多