📜  c#反射创建泛型类型 - C#(1)

📅  最后修改于: 2023-12-03 15:13:53.364000             🧑  作者: Mango

C#反射创建泛型类型

在C#中,反射是一种强大的工具,可以在运行时动态地查看和修改对象的属性和行为。反射使得我们可以在编译时不知道具体类型的情况下,创建对象、调用方法、读取属性等等。

本文将着重讨论如何使用C#反射创建泛型类型。

创建泛型类型

在C#中,我们可以使用Type.MakeGenericType方法创建泛型类型。该方法的签名如下:

public Type MakeGenericType(params Type[] typeArguments);

其中,typeArguments参数是一个Type类型的数组,它指定了所需的类型参数。例如,我们可以使用下面的代码创建一个泛型列表类型:

Type genericType = typeof(List<>).MakeGenericType(typeof(string));

在这个例子中,我们使用typeof运算符获取List的Type对象,并调用MakeGenericType方法指定类型参数Type对象。这将返回一个表示泛型类型List的Type对象。

创建泛型实例

一旦我们拥有一个表示泛型类型的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#开发中灵活运用这一技巧。