C#泛型秘诀(2)2011-03-254.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”主题。