📜  C#反射(1)

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

C# 反射

在C#中,反射是指能够在运行时动态地获取程序集中类型的信息的技术。它可以让我们在运行时动态地创建对象、调用方法、获取或设置属性和字段的值,以及执行其他各种操作。

反射的优缺点
优点
  1. 动态地获取类型信息,可以实现一些高级功能,如插件化、ORM映射等;
  2. 可以查找类型的属性、方法、字段等信息,方便代码逻辑的编写;
  3. 可以在运行时动态地创建对象,可以根据需要动态地调用方法,方便灵活;
  4. 可以调用属性、方法、字段的信息,方便对代码的重用。
缺点
  1. 反射的性能消耗较大,相比于直接调用方法、属性等,效率有所下降,特别是在频繁调用时;
  2. 反射的代码可读性不够强,也容易出现一些不易察觉的错误。
反射的用法
获取类型信息

首先我们需要获取要反射的类型信息,一般有以下三种方式:

  • 使用typeof()方法,可以直接获取某个类型的信息。
Type type1 = typeof(string);
  • 使用GetType()方法,可以获取对象的类型信息。
string str = "Hello";
Type type2 = str.GetType();
  • 使用Assembly.GetExecutingAssembly()方法,可以获取当前程序集(即当前应用程序域)中的类型信息。
Type type3 = Assembly.GetExecutingAssembly().GetType("Demo.Test");
获取属性、方法、字段

获取属性、方法、字段等信息,我们需要使用Type对象中的相应的方法或属性。以下是一些例子:

  • 获取属性信息
PropertyInfo propertyInfo = testType.GetProperty("TestProperty");
  • 获取方法信息
MethodInfo methodInfo = testType.GetMethod("TestMethod");
  • 获取字段信息
FieldInfo fieldInfo = testType.GetField("TestField");
动态创建实例和调用方法

使用Activator类可以动态地创建对象,而使用MethodInfo.Invoke方法可以调用指定对象的方法。以下是一些例子:

  • 使用Activator创建对象
object obj = Activator.CreateInstance(testType);
  • 使用MethodInfo.Invoke调用方法
methodInfo.Invoke(obj, new object[] { "Hello, World!" });
修改属性和字段的值

使用PropertyInfo.SetValue方法可以动态地设置属性的值,而使用FieldInfo.SetValue可以设置字段的值。以下是一些例子:

  • 设置属性的值
propertyInfo.SetValue(obj, "Hello, World!", null);
  • 设置字段的值
fieldInfo.SetValue(obj, "Hello, World!");
总结

反射是C#中十分强大而灵活的技术,它可以让我们在运行时动态地获取类型信息,创建对象和调用方法,以及修改属性和字段的值。虽然反射的性能不如直接调用,但在一些需要动态地获取类型信息的情况下,反射是十分有用的。