📅  最后修改于: 2023-12-03 14:58:05.295000             🧑  作者: Mango
在C#中,我们有时需要通过字符串来动态地引用一个类,然而C#中并没有提供直接的方法来实现这一功能。但是,我们可以使用反射来实现这一目标。
反射是C#中非常强大的功能,它允许我们在程序运行时动态地获取和使用程序集中的类型信息。通过反射,我们可以在运行时访问和操作类型的成员,比如方法、属性、字段等等。
反射的主要类是System.Reflection命名空间下的Type类。Type类表示一个类型,它提供了获取类型信息的各种方法。
我们可以使用Type.GetType方法来通过字符串获取类型。GetType方法接受一个字符串参数,返回一个Type对象。如果没有找到对应的类型,则返回null。
string typeName = "System.String";
Type type = Type.GetType(typeName);
在实际应用中,我们可以通过配置文件、数据库等方式获取要引用的类的字符串名称,然后根据名称通过反射获取该类型。
获取类型之后,我们可以使用Activator.CreateInstance方法来创建该类型的实例。该方法接受一个Type参数,返回一个Object对象,即该类型的一个实例。如果该类型没有公共的无参构造方法,则会抛出异常。
object instance = Activator.CreateInstance(type);
获取类型的实例之后,我们可以使用MethodInfo类来调用该类型的方法。MethodInfo类表示一个方法,它提供了各种方法来获取方法信息、调用方法等。
首先,我们需要使用Type.GetMethod方法获取要调用的方法的MethodInfo对象。该方法接受方法的名称和方法参数类型数组作为参数,返回一个MethodInfo对象。
string methodName = "Substring";
Type[] parameterTypes = new Type[] {typeof(int)};
MethodInfo methodInfo = type.GetMethod(methodName, parameterTypes);
如果我们要调用的方法是一个重载方法,我们需要指定方法参数类型数组,以区分不同的重载方法。
获取MethodInfo对象之后,我们可以使用MethodInfo.Invoke方法来调用该方法。该方法接受方法的实例对象和方法参数数组作为参数,返回方法的返回值。
object[] parameters = new object[] {2};
object result = methodInfo.Invoke(instance, parameters);
通过反射,我们可以动态地获取和使用程序集中的类型信息。通过Type.GetType方法,我们可以根据类型名称获取对应的Type对象;通过Activator.CreateInstance方法,我们可以创建该类型的实例;通过MethodInfo类,我们可以获取方法信息和调用该类型的方法。
虽然反射功能强大,但是它也有一些缺点。使用反射进行代码操作通常会比直接调用类型的成员要慢。反射还会增加程序的复杂性和维护成本,因此应该谨慎使用反射功能。
参考链接: