Interface 自动映射:映射具有接口属性的对象

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

我当前的任务需要注意不同对象类型之间的映射,因此我认识到非常好的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
,反之亦然。
通过配置
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(/*...*/)));
在我的例子中,它是将接口属性映射到我的类定义的具体实现的解决方案

希望它有用