【发布时间】:2014-09-30 12:25:03
【问题描述】:
我有基类
public abstract class DtoBase //NOTICE that this class is abstract
{
//some DTO specific things
}
public class concreteA_Dto : DtoBase
{
//some properties from A
}
public class concreteB_Dto : DtoBase
{
//some properties from B
}
然后我有一些课程,他们彼此不认识
public class concreteA //NOTICE that there is NO base class
{
//some properties from A
}
public class concreteB
{
//some properties from B
}
我想要以这种方式使用 Automapper:
private DtoBase GetResourceDto(object value)
{
return Mapper.Map<DtoBase>(value);
}
到目前为止,我的映射如下所示:
CreateMap<concreteA, DtoBase>()
.Include<concreteA, concreteA_Dto>();
CreateMap<concreteA, concreteA_Dto>();
但是当我用一些具体的实例调用 GetResourceDto 方法时,我会得到 p>
自动映射器异常:
Mapping types:
concreteA-> DtoBase
#NAMESPACE.concreteA -> #NAMESPACE.DtoBase
Destination path:
DtoBase
内部异常
无法创建抽象类的实例。
请注意,#NAMESPACE 是我的类的命名空间
如何执行适当的映射以避免此异常?
这背后的想法是concreteA和concreteB可以随时间动态增长,并且可能有concreteC、concreteD等。 我不介意为更具体的类添加映射
【问题讨论】:
-
您无法映射到抽象类,AutoMapper 会创建您要映射到的类的新实例,并且错误表明您无法实例化抽象类。使您的基类具体化,它会起作用,抽象类是不合适的,因为您确实想创建它的实例。
-
实际上我不想创建 DtoBase 的实例,我期望 GetResourceDto 的返回值是具体 A_Dto 的实例。
-
当像这样使用自动映射器时,类层次结构必须匹配。如果您在“具体”层次结构中创建一个基类,则一切正常。
-
这很可悲。因为有时可以代替我的具体B 来获取 List
的示例实例,并且我想将其转换为适当的 DTO 并提供其他信息。
标签: c# automapper dto