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”主題。