📅  最后修改于: 2023-12-03 15:13:53.364000             🧑  作者: Mango
在C#中,反射是一种强大的工具,可以在运行时动态地查看和修改对象的属性和行为。反射使得我们可以在编译时不知道具体类型的情况下,创建对象、调用方法、读取属性等等。
本文将着重讨论如何使用C#反射创建泛型类型。
在C#中,我们可以使用Type.MakeGenericType方法创建泛型类型。该方法的签名如下:
public Type MakeGenericType(params Type[] typeArguments);
其中,typeArguments参数是一个Type类型的数组,它指定了所需的类型参数。例如,我们可以使用下面的代码创建一个泛型列表类型:
Type genericType = typeof(List<>).MakeGenericType(typeof(string));
在这个例子中,我们使用typeof运算符获取List
一旦我们拥有一个表示泛型类型的Type对象,就可以在运行时动态地创建该类型的实例。为此,我们可以使用Activator.CreateInstance方法,该方法的签名如下:
public static object CreateInstance(Type type, params object[] args);
其中,type参数是表示要创建的类型的Type对象,args参数是一个对象数组,包含传递给构造函数的参数。如果要创建的类型没有公共的无参数构造函数,将引发MissingMethodException异常。
例如,我们可以使用下面的代码创建List
object instance = Activator.CreateInstance(genericType);
在这个例子中,我们使用前面创建的Type对象调用Activator.CreateInstance方法。
一旦我们创建了泛型类型的实例,就可以通过反射调用其成员。例如,对于一个泛型列表对象,我们可以通过Add方法添加一个元素:
MethodInfo addMethod = genericType.GetMethod("Add");
addMethod.Invoke(instance, new object[] { "hello" });
在这个例子中,我们使用Type.GetMethod方法获取Add方法的MethodInfo对象,然后使用Invoke方法调用Add方法并传递一个字符串参数。
C#反射是一个非常强大的工具,可以在编译时不知道具体类型的情况下,动态地创建对象、调用方法、读取属性等等。本文介绍了如何使用C#反射创建泛型类型及其实例,并调用其成员方法。希望读者可以在自己的C#开发中灵活运用这一技巧。