2014-09-30 143 views
0

我有基類Automapper抽象類

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與concreteA的一些例子中,我會得到

Automapper例外:

Mapping types: 
concreteA-> DtoBase 
#NAMESPACE.concreteA -> #NAMESPACE.DtoBase 

Destination path: 
DtoBase 

與內部異常不能創建抽象類的

實例。

注意#NAMESPACE是我

的命名空間如何進行適當的映射,這將避免這種例外?這背後

的想法是,concreteA和concreteB可以dynamicaly長的時間,有可能是concreteC,澆築等 我不介意加入映射爲更具體的類

+0

不能映射到一個抽象類,AutoMapper創建你映射到的和錯誤說,你不能實例化一個抽象類的類的新實例。使你的基類具體而且可行,抽象類是不合適的,因爲你確實想創建它的實例。 – 2014-09-30 12:41:38

+0

其實我不想創建DtoBase的實例,我期望GetResourceDto的返回值是concreteA_Dto的實例。 – LightCZ 2014-09-30 12:43:18

+0

像這樣使用automapper時,類層次結構必須匹配。如果你在「具體」層次結構中創建一個基類,事情應該可以正常工作。 – 2014-09-30 13:26:42

回答

0

你可能經常有類似的映射問題,除非你不不使用代理類進行映射。

爲您想要映射的每個類創建代理類。

你可以得到額外的幫助,從here

+0

謝謝我想,從建築學的角度來看,應該有代理班,應該有本基和安德魯指出的基礎班。我將重構我的解決方案並添加此部分 – LightCZ 2014-10-03 14:45:38