在C#中,反射(Reflection)允许你在运行时检查对象的类型、调用对象的方法、访问对象的字段、获取对象的属性以及创建和实例化对象。这些功能都是通过System.Reflection命名空间中的类来实现的。
以下是C#中使用反射的一些常见示例:
- 获取类型的信息:
使用Type
类可以获取一个对象或类型的元数据。
using System;
using System.Reflection;
public class ExampleClass
{
public int ExampleField;
public void ExampleMethod() { }
}
class Program
{
static void Main()
{
Type type = typeof(ExampleClass);
// 获取类型的名称
Console.WriteLine("Type Name: " + type.Name);
// 获取类型的所有公共方法
MethodInfo[] methods = type.GetMethods();
foreach (var method in methods)
{
Console.WriteLine("Method: " + method.Name);
}
// 获取类型的所有公共字段
FieldInfo[] fields = type.GetFields();
foreach (var field in fields)
{
Console.WriteLine("Field: " + field.Name);
}
}
}
- 创建实例:
使用Activator.CreateInstance
方法可以动态地创建对象实例。Type type = typeof(ExampleClass); object instance = Activator.CreateInstance(type);
若目标有参数这跟在type后,用“,”隔开
- 调用方法:
如果知道方法的名称和参数类型,可以使用MethodInfo.Invoke
来调用它。MethodInfo method = type.GetMethod("ExampleMethod"); method.Invoke(instance, null); // 假设ExampleMethod没有参数
- 访问和修改字段和属性:
使用FieldInfo
和PropertyInfo
类可以访问和修改对象的字段和属性。FieldInfo field = type.GetField("ExampleField"); field.SetValue(instance, 42); // 设置字段的值 PropertyInfo property = type.GetProperty("SomeProperty"); object propertyValue = property.GetValue(instance); // 获取属性的值 property.SetValue(instance, "NewValue", null); // 设置属性的值
- 获取自定义属性:
可以使用GetCustomAttributes
方法来获取附加到类型或成员的自定义属性。object[] attributes = type.GetCustomAttributes(false); foreach (var attr in attributes) { Console.WriteLine(attr.GetType().Name); }