最近在弄一些反射相关的东西,遇到了一些反射和泛型结合带来的问题,今天把最近与到的问题整理一下,分享给大家。
常见的定义泛型的类有两种,我们称之为
开放式构造类型 (open constructed type)
封闭式构造类型(closeed constructed type)
此文中,我们分别定义两个泛型类如下:
View Code
public class ClassT<T,TR,TV>
{
public T Test()
{
return default(T);
}
public T Print(T t)
{
Console.WriteLine("ClassT"+t);
return t;
}
public T Print(T t, TR tr)
{
Console.WriteLine("ClassT" + t);
return t;
}
public T Print(T t, TV tv)
{
Console.WriteLine("ClassT" + t);
return t;
}
}
public class DerivedClassT: ClassT<string,string,int>
{
}
封闭是的构造类型和普通类型的反射过程基本一致,这里不重点介绍了,下面我们主要介绍开放式构造类型的反射:
1. 如何反射创建泛型类对象?一共四步:
1).获得对象的Type
对于泛型类,必须要确认获得的Type是否是指定了参数类型的,如:
Type type1 = typeof(ClassT<,,>);//ContainsGenericParameters==true
Type type2 = typeof(ClassT<string, string, int>);//ContainsGenericParameters==false
Type type3 = assembly.GetType("Testdll.ClassT`3");//ContainsGenericParameters==true
Type type4 = instance.GetType();//ContainsGenericParameters==false
2).如果是开放式的构造类型,为泛型类Type指定类型,由于ClassT的构造方法不包含任何参数,因此ctorInfo的ContainsGenericParameters为false,但是如果需要创建一个对象,必须保证type的ContainsGenericParameters也为false,否则需要为泛型类指定类型。
if (type1.ContainsGenericParameters)
{
type1 = type1.MakeGenericType(typeof (string), typeof (string), typeof (int));//为泛型类指定类型
}
2).获得指定类型之后的Type的ConstructorInfo
ConstructorInfo ctorInfo=type1.GetConstructor(new Type[0]);
4).Invoke
ctorInfo.Invoke(new object[0]);


