泛型反射
程序员文章站
2022-03-03 11:49:24
...
检查泛型类型及其类型参数
1、获取泛型类型
//类型1 Type d1 = typeof(Dictionary<,>); Dictionary<string, Example> d = new Dictionary<string, Example>(); //类型2 Type d2=d.GetType();
2、判断是否为泛型,是否为泛型类型定义
Console.WriteLine(" Is this a generic type? {0}", d1.IsGenericType); //IsGenericType 判断是泛型类型 Console.WriteLine(" Is this a generic type definition? {0}", d1.IsGenericTypeDefinition); //IsGenericTypeDefinition 判断是泛型类型定义 //以上两个结果都为True. 对于类型d2来说,IsGenericType=true,IsGenericTypeDefinition=false.
3、使用 GetGenericArguments 方法获取包含泛型类型参数的数组。
Type[] typeParameters = d1.GetGenericArguments(); //获取到两个泛型中的参数,如上为两个参数Tkey,TValue
Type[] typeParameters = d2.GetGenericArguments(); //也是两个参数:string,Example
4、对于每个类型实参,使用 IsGenericParameter 属性确定它是类型形参(例如,在泛型类型定义中),还是为类型形参指定的类型(例如,在构造类型中)。
foreach( Type tParam in d1.GetGenericArguments()) { if (tParam.IsGenericParameter) { DisplayGenericParameter(tParam); } else { Console.WriteLine(" Type argument: {0}", tParam); } } //对d1类型来说,IsGenericParameter 返回参数都为true //对d2类型来说,IsGenericParameter 返回参数都为false,因为都是已经指定的类型。
5、d1 和 d2 如何转化
//下面两种方式获取泛型的类型 // //使用typeof操作符创建泛型类型,省略参数,但要用逗号分隔 Type d1 = typeof(Dictionary<,>); // 使用构造函数获取泛型类型,这里确定key string类型,value为定义的一个class Dictionary<string, Example> d2 = new Dictionary<string, Example>(); Type d3 = d2.GetType(); //通过GetGenericTypeDefinition方法可以获取到泛型定义 //以上d1==d4 Type d4 = d3.GetGenericTypeDefinition(); //根据d1得到d4,首先定义两个类型的参数 Type[] typeArgs = {typeof(string), typeof(Example)}; //调用 MakeGenericType 方法,将类型实参绑定到类型形参,然后构造类型 Type constructed = d1.MakeGenericType(typeArgs); //反射实例化 object o = Activator.CreateInstance(constructed); d3==typeof(o) 也为true
上一篇: go 语言中的 类注册 与 反射问题
下一篇: java,java反射