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