4.3 獲取泛型的類型
問題
您需要在運行時獲得一個泛型類型實例的Type對象。
解決方案
在使用typeof操作符時提供類型參數;使用類型參數實例化的泛型類型,用GetType()方法。
聲明一個一般類型和一個泛型類型如下:
public class Simple
{
public Simple()
{
}
}
public class SimpleGeneric<T>
{
public SimpleGeneric()
{
}
}
使用typeof操作符和簡單類型的名稱就可以在運行時獲得簡單類型的類型。對於泛型類型來說,在調用typeof時類型參數必須要提供,但是簡單類型實例和泛型類型實例都可以使用相同的方式來調用GetType()。
Simple s = new Simple();
Type t = typeof(Simple);
Type alsoT = s.GetType();
//提供類型參數就才可以獲得類型實例
Type gtInt = typeof(SimpleGeneric<int>);
Type gtBool = typeof(SimpleGeneric<bool>);
Type gtString = typeof(SimpleGeneric<string>);
// 當有一個泛型類實例時,您也可以使用GetType的舊的方式去調用一個實例。.
SimpleGeneric<int> sgI = new SimpleGeneric<int>();
Type alsoGT = sgI.GetType();
討論
不能直接獲取泛型類的類型,因為如果不提供一個類型參數,泛型類將沒有類型(參考秘訣4.2獲得更多信息)。只有通過類型參數實例化的泛型類才有Type。
如果您在使用typeof操作符時,只提供泛型類型定義而不提供類型參數,將得到下面的錯誤:
// 這產生一個錯誤:
// Error 26 Using the generic type 'CSharpRecipes.Generics.SimpleGeneric<T>'
// requires '1' type arguments
Type gt = typeof(SimpleGeneric);
閱讀參考
查看秘訣4.2;參考MSDN文檔中的“typeof”主題。