反射(Reflection)是C#中的一项高级特性,它允许程序在运行时检查和操作程序集、模块、类型等元数据信息。通过反射,你可以在不知道类型信息的情况下,动态地创建对象、调用方法、访问属性等。
反射的核心在于System.Reflection
命名空间,它提供了许多类和接口,用于获取类型信息、创建实例、调用方法等。反射主要用于以下场景:
假设我们有一个简单的类Person
,我们希望在运行时使用反射来创建该类的实例并调用其方法。
- public class Person
- {
- public string Name { get; set; }
-
- public void SayHello()
- {
- Console.WriteLine($"Hello, my name is {Name}.");
- }
- }
- // 获取Person类的Type对象
- Type personType = typeof(Person);
-
- // 使用Activator.CreateInstance动态创建Person类的实例
- object personInstance = Activator.CreateInstance(personType);
-
- // 设置Name属性
- PropertyInfo nameProperty = personType.GetProperty("Name");
- nameProperty.SetValue(personInstance, "Alice");
-
- // 调用SayHello方法
- MethodInfo sayHelloMethod = personType.GetMethod("SayHello");
- sayHelloMethod.Invoke(personInstance, null);
假设Person
类在一个单独的程序集中,我们可以动态加载该程序集并进行操作。
- // 动态加载程序集
- Assembly assembly = Assembly.LoadFrom("PathToYourAssembly.dll");
-
- // 获取Person类的Type对象
- Type personType = assembly.GetType("YourNamespace.Person");
-
- // 动态创建Person类的实例并调用方法(步骤同上)
反射是C#中一个非常强大的特性,它提供了在运行时检查和操作类型信息的能力。通过反射,你可以实现许多高级功能,如动态创建对象、调用方法、加载程序集等。然而,由于反射的性能和可读性问题,建议在确实需要动态操作时才使用反射,并在可能的情况下使用其他替代方案。