欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

泛型反射

程序员文章站 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

 

 

相关标签: 泛型 反射