.NET 中的反射是一种强大的技术,允许程序在运行时动态地探索、查询和操作程序集(assembly)、类型(type)和对象。通过反射,你可以在运行时获取关于类型和成员(方法、属性、字段等)的信息,调用方法、访问和修改属性、创建对象等,而无需在编译时知道这些类型的确切信息。
以下是C#反射的一些关键概念:
1. Assembly(程序集)
程序集是 .NET 中的基本部署单元,可以是 DLL 或 EXE 文件。
反射可以加载和操作程序集,获取其中包含的类型和成员信息。
2. Type(类型)
类型是程序中的数据结构,描述了对象的结构和行为。
反射可以用来获取类型的信息,如名称、方法、属性、字段等。
3. MemberInfo(成员信息)
表示类型的成员,如方法、属性、字段、事件等。
可以使用反射获取和操作这些成员的信息。
4. MethodInfo、PropertyInfo、FieldInfo、EventInfo 等
这些是特定类型的成员信息的子类,分别表示方法、属性、字段、事件等。
反射可以使用这些类来操作相应类型的成员,如调用方法、获取和设置属性值、修改字段值等。
5. 使用反射的方法
获取类型信息:通过 Type.GetType()、typeof() 或 GetType() 方法获取类型的实例,然后探索其成员。
创建对象:使用 Activator.CreateInstance() 创建实例。
调用方法:使用 Invoke() 方法调用类型的方法。
访问和设置属性、字段:使用 PropertyInfo、FieldInfo 等类来获取和设置相应成员的值。
6. 注意事项
反射是强大的工具,但也可能导致性能下降,因为它涉及到动态解析和调用。
访问私有成员或调用不合适的方法可能引起安全问题。
反射在许多情况下非常有用,例如在编写通用框架、插件系统、序列化、ORM 等工具时,但要谨慎使用,因为它可能导致代码更加复杂和难以维护。