当然!你问的“什么是反射”,这里给你一个通俗易懂的中文解释:


反射(Reflection)是什么?

反射 是 .NET(以及很多语言和平台,比如 Java)提供的一种机制,它能让程序在运行时查看、检查、访问甚至修改自身的类型信息

简单来说:

反射就是在运行时动态获取或操作对象、类型、方法、属性等元数据的能力。

常用的 System.Reflection 类型
Type
表示 .NET 中任何类型的运行时信息,是反射的核心入口。

PropertyInfo
表示属性的元数据,能用来读/写属性值。

MethodInfo
表示方法的元数据,能用来调用方法。

FieldInfo
表示字段的元数据,能用来访问字段值。

ConstructorInfo
表示构造函数的元数据,可以用来创建对象。

Assembly
表示程序集(.dll 或 .exe),可以用它动态加载程序集并获取类型信息。

MemberInfo
表示成员(属性、方法、字段等)的基类,很多 API 返回它。


举个简单的例子

假设你有一个类:

1
2
3
4
public class Person
{
public string Name { get; set; }
}
  • 在平时的代码里,你可以直接用:
1
2
var p = new Person();
p.Name = "Alice";
  • 但如果你想在不知道类名字、属性名字的情况下,从字符串 "Person""Name" 来动态操作——就要用到 反射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 运行时通过字符串获取类型
Type type = Type.GetType("YourNamespace.Person");

// 创建实例
object obj = Activator.CreateInstance(type);

// 获取属性
var prop = type.GetProperty("Name");

// 设置属性值
prop.SetValue(obj, "Alice");

// 读取属性值
string value = (string)prop.GetValue(obj);

Console.WriteLine(value); // 输出 Alice

这就是反射:在程序运行时,通过类型的元信息(metadata)对类型、方法、属性等进行操作。


反射能做什么?

获取类型信息
比如拿到类、接口、方法、属性、字段、构造函数的元数据。

动态创建对象
比如你写一个插件系统,需要根据配置文件里写的类名创建实例。

调用方法
你甚至可以在不知道方法名的情况下,通过字符串找到方法并调用。

访问和修改属性/字段
比如 ORM 框架会用反射把数据库结果自动映射到对象属性。

读取特性(Attribute)
你可以在运行时读取类、属性、方法上的自定义特性(attribute),根据它们做不同的逻辑。

动态加载程序集
比如插件系统,可以运行时加载 .dll 文件并使用里面的类型。


常用场景

JSON/XML/数据库序列化/反序列化(自动映射到对象)
IoC 容器(依赖注入)根据类型创建对象
ORM 框架(EF Core、Dapper)
日志、审计系统
插件架构:动态加载和调用插件
写工具或框架:比如自动生成代码、做模型验证


为什么叫“反射”?

因为它就像程序“照镜子”,能看见自己(类型结构、属性、方法)并且操作自己


反射的缺点

  • 性能比直接代码调用慢很多(虽然可以缓存反射结果减少开销)。
  • 可维护性差:反射常用字符串(类型名、属性名),这些字符串如果拼错,编译器不会提示错误。
  • 使用不当会破坏封装性(比如可以访问私有成员)。

总结

反射让你在运行时获取和操作类型信息,是很多框架的底层支撑
用于动态行为、插件、自动化映射等
功能强大,但要小心性能和可维护性