2009-09-23 104 views
4

我找不到在C#3.0/.NET 3.5的泛型構造中使用第一類Type對象(System.Type實例)作爲類型參數的方法。下面是我想做一個簡單的例子:使用Type對象作爲C#中泛型的類型參數

public void test() 
{ 
    Type someType = getSomeType(); // get some System.Type object 

    MyGeneric<someType> obj = new MyGeneric<someType>(); // won't compile 
} 

有沒有辦法使用SOMETYPE對象作爲一個通用的類型參數?

+0

我個人使用了一個Switch。這可能並不適用於任何地方......我希望它可以像你的例子那樣。 – 2011-12-13 21:14:31

回答

17

您可以動態創建類型的實例:

public void test() 
{ 
    Type someType = getSomeType(); // get some System.Type object 
    Type openType = typeof(MyGeneric<>); 
    Type actualType = openType.MakeGenericType(new Type[] { someType }); 
    object obj = Activator.CreateInstance(actualType); 
} 

但是你不能聲明這種類型的變量,因爲你不知道實際的類型靜態。

+0

如果任何人通過這篇文章,在C#4.0 [動態關鍵字](http://msdn.microsoft.com/en-us/library/dd264741.aspx)允許您聲明變量的編譯時類型檢查被禁用。 – 2014-01-09 09:49:00

+0

@JacobBundgaard,是的,但它與OP的問題無關。它不允許您在編譯時不知道類型參數的情況下創建泛型類型的實例。 – 2014-01-09 10:16:53

+0

我不這麼認爲。動態聲明將允許您調用通過反射創建的MyGeneric對象的方法,而對象聲明不會。考慮MyGeneric有一個方法MyMethod。然後這段代碼將不起作用:'object obj = Activator.CreateInstance(actualType); obj.MyMethod();',而這會:'dynamic obj = Activator.CreateInstance(actualType); obj.MyMethod();' – 2014-01-09 10:27:38

9

您正試圖在運行時確定您的類型參數。 .Net泛型要求編譯時知道類型參數。在切換類型之外確實沒有辦法做到這一點。你可以通過反射來獲得方法的句柄並調用它,但這很難看。

+3

+1托馬斯顯示如何做,但你更好地解釋_why_反射是必需的。 – 2009-09-23 16:27:35

相關問題