什么是反射
当然!你问的“什么是反射”,这里给你一个通俗易懂的中文解释:
反射(Reflection)是什么?
反射 是 .NET(以及很多语言和平台,比如 Java)提供的一种机制,它能让程序在运行时查看、检查、访问甚至修改自身的类型信息。
简单来说:
反射就是在运行时动态获取或操作对象、类型、方法、属性等元数据的能力。
常用的 System.Reflection 类型
Type
表示 .NET 中任何类型的运行时信息,是反射的核心入口。
PropertyInfo
表示属性的元数据,能用来读/写属性值。
MethodInfo
表示方法的元数据,能用来调用方法。
FieldInfo
表示字段的元数据,能用来访问字段值。
ConstructorInfo
表示构造函数的元数据,可以用来创建对象。
Assembly
表示程序集(.dll 或 .exe),可以用它动态加载程序集并获取类型信息。
MemberInfo
表示成员(属性、方法、字段等)的基类,很多 API 返回它。
举个简单的例子
假设你有一个类:
1 | public class Person |
- 在平时的代码里,你可以直接用:
1 | var p = new Person(); |
- 但如果你想在不知道类名字、属性名字的情况下,从字符串
"Person"
和"Name"
来动态操作——就要用到 反射:
1 | // 运行时通过字符串获取类型 |
这就是反射:在程序运行时,通过类型的元信息(metadata)对类型、方法、属性等进行操作。
反射能做什么?
获取类型信息
比如拿到类、接口、方法、属性、字段、构造函数的元数据。
动态创建对象
比如你写一个插件系统,需要根据配置文件里写的类名创建实例。
调用方法
你甚至可以在不知道方法名的情况下,通过字符串找到方法并调用。
访问和修改属性/字段
比如 ORM 框架会用反射把数据库结果自动映射到对象属性。
读取特性(Attribute)
你可以在运行时读取类、属性、方法上的自定义特性(attribute),根据它们做不同的逻辑。
动态加载程序集
比如插件系统,可以运行时加载 .dll 文件并使用里面的类型。
常用场景
JSON/XML/数据库序列化/反序列化(自动映射到对象)
IoC 容器(依赖注入)根据类型创建对象
ORM 框架(EF Core、Dapper)
日志、审计系统
插件架构:动态加载和调用插件
写工具或框架:比如自动生成代码、做模型验证
为什么叫“反射”?
因为它就像程序“照镜子”,能看见自己(类型结构、属性、方法)并且操作自己。
反射的缺点
- 性能比直接代码调用慢很多(虽然可以缓存反射结果减少开销)。
- 可维护性差:反射常用字符串(类型名、属性名),这些字符串如果拼错,编译器不会提示错误。
- 使用不当会破坏封装性(比如可以访问私有成员)。
总结
反射让你在运行时获取和操作类型信息,是很多框架的底层支撑
用于动态行为、插件、自动化映射等
功能强大,但要小心性能和可维护性