反射(Reflection)是指程序可以访问、检测和修改它本身状态或行为的一种能力。在 C# 中,反射可以让我们在运行时动态地获取类型信息、访问属性、调用方法、构造对象等。
反射的核心是 Type 类型,它代表着一个 .NET 类型,可以获取该类型的各种信息,例如名称、基类、接口、属性、方法、构造函数等。通过 Type 类型,我们可以在运行时动态地创建对象、调用方法、访问属性等。
在 C# 中,使用反射需要使用 System.Reflection 命名空间中的类和方法。常用的类和方法包括:
Type:代表一个 .NET 类型。
Assembly:代表一个程序集。
Activator:可以通过反射创建对象。
BindingFlags:用于控制反射的搜索范围和搜索方式。
GetTypeInfo():获取一个 Type 类型的 TypeInfo 对象,可以获取该类型的各种信息。
GetMethod():获取指定名称的方法信息。
Invoke():调用指定的方法。
反射的使用场景包括但不限于:
动态创建对象。
调用对象的方法。
获取对象的属性值。
在运行时加载程序集。
动态生成代码。
需要注意的是,反射的使用会影响程序的性能,因此应该谨慎使用。
以下是一个简单的反射示例代码:
using System;
using System.Reflection;
class MyClass
{
public int MyProperty { get; set; }
public void MyMethod() { Console.WriteLine("Hello World!"); }
}
class Program
{
static void Main(string[] args)
{
// 创建 MyClass 实例
MyClass myObject = new MyClass();
// 获取 MyClass 类型
Type myType = typeof(MyClass);
// 获取 MyClass 的 MyProperty 属性
PropertyInfo propertyInfo = myType.GetProperty("MyProperty");
// 设置 MyProperty 属性值为 42
propertyInfo.SetValue(myObject, 42);
// 获取 MyClass 的 MyMethod 方法
MethodInfo methodInfo = myType.GetMethod("MyMethod");
// 调用 MyMethod 方法
methodInfo.Invoke(myObject, null);
// 输出 MyProperty 的值
Console.WriteLine(myObject.MyProperty);
}
}
这段代码演示了如何使用反射来获取一个类的属性和方法,并在运行时动态地调用它们。在这个例子中,我们创建了一个 MyClass 实例,并使用反射来获取它的 MyProperty 属性和 MyMethod 方法。我们设置 MyProperty 的值为 42,并调用 MyMethod 方法,最后输出 MyProperty 的值。