2011-10-06 89 views
0

類型參數我有以下簽名使用混凝土類作爲繼承了通用基礎類

public class ReportViewModelBaseDTO<VT,DT> 

和具體的類像這樣的

public class ChartViewModelDTO:ReportViewModelBaseDTO<ChartViewModel,ChartViewModelDTO> 

我的問題是一個基類,我知道,我的泛型基類的第二個類型參數應該是具體類的類型。我不想一直重複自己的命名,然後重複這個名字作爲類型參數。

有什麼辦法讓我的泛型基類將實際的具體類作爲類型參數?有沒有人有更好的方法來做到這一點的任何建議?

編輯:

我要如何使用DT低於一個例子。我從VT類型的Automapper創建一個類型爲DT的實例。

public static DT Create(VT viewModel) 
     { 
      return Mapper.Map<VT,DT>(viewModel); 
     } 
+0

你可以提供你想要如何使用DT請用例?這感覺有點奇怪,基類需要知道它是基類的具體實現。我可以看到一些用途(例如從方法返回正確的類型)但不是很多。 – Joey

+1

C#沒有辦法強制執行您所要求的要求,強制將基類的泛型T作爲派生類的類型。看到[這個相關的問題](http://stackoverflow.com/questions/3783321/why-does-this-generic-constraint-compile-when-it-seems-to-have-a-circular-referen/3789193#3789193 )更多。 –

回答

1

這是你的意思嗎?

public class ReportViewModelBaseDTO<VT,DT> where DT : ReportViewModelBaseDTO<VT,DT> 

現在你的類'知道'第二個類型參數是它自己的具體實現。

爲了您的實例方法,你可以這樣做:

public static DT Create(VT viewModel) 
{ 
    return Mapper.Map<VT, DT>(viewModel); 
} 

,並定義爲Mapper.Map

private U Map<T, U>(ViewModel viewModel) where U : ReportViewModelBaseDTO<T,U>{...} 
+0

它知道*,還是僅僅假設?考慮'class Animal 其中T:Animal {} class Cat:Animal {} class Dog:Animal {}'這是合法的。 C#沒有辦法強制只有* Cat *可以從'Animal '繼承。 –

+0

不是,我想讓我的基類知道派生類是什麼類型,以便我可以在返回的方法中使用該類型,例如我的編輯 –

+0

使地圖通用,即Mapper.Map (... ),然後你可以讓Map返回正確的類型。 – Joey