目录

反射(Reflection) 和 特性(Attribute)

① 反射是什么?(Reflection)

武侠比喻:反射 = 掌握“窥探他人武功心法”的能力

在武侠世界中:

  • 普通门派弟子只会按流程练功
  • 但你若会“天眼通”,你可以:

● 知道别人会什么武功
● 找到别人身上的穴位、筋脉结构
● 动态复制对方的招式
● 甚至调用别人正在练的某招功法

这就是反射的作用。

对应到 C# 的反射:

反射允许你:

  • 查看一个类有哪些属性
  • 查看它有哪些方法
  • 动态创建类实例
  • 动态调用某个方法
  • 读取和修改字段
  • 判断某个方法是否带了某个特性

就像这样:

var type = typeof(User);
var methods = type.GetMethods();
var props = type.GetProperties();

你就是那个拥有天眼通的武林高手。

② 特性(Attribute)是什么?

武侠比喻:特性 = 贴在武功秘籍或弟子身上的“标签”

比如一本秘籍上写着:

“禁用轻功时使用”
“只有内力大于100的人可学”
“此招式冷却10秒”

这些提示信息其实不影响武功本身,但会影响 如何使用武功

特性就是这种 “额外的标签信息”

  • 不改变代码本身的逻辑
  • 但告诉系统 / 框架:这个东西有什么“特殊要求”

例如:

[Obsolete("此方法已过时,请用NewMethod")]
public void OldMethod() { }

这就像贴了:

⚠️ “老弟子不准再练此招”

③ 特性 + 反射 = 武林最强组合

反射可以 读取 特性。

特性本身不具备威力,
反射才是 看懂特性的能力
并让程序因此做出不同逻辑。

像这样:

var attrs = typeof(User).GetCustomAttributes();

武侠比喻:

● 特性 = 写在弟子身上的“标签”
● 反射 = 能看懂标签、并根据标签做事的天眼通

比如:
你看到某个弟子胸口贴了“会飞”标签,你就把他分到“飞行大队”。

④ 实际代码例子(武侠版本)

定义特性(给弟子贴标签)

[AttributeUsage(AttributeTargets.Class)]
public class MasterLevelAttribute : Attribute
{
   public int Level { get; }
   public MasterLevelAttribute(int level) => Level = level;
}

使用方式:

[MasterLevel(5)]
public class ZhangWuJi {}

就像武林管理处贴标签:

“张无忌是 5 级高手”

反射读取特性(使用天眼通)

var type = typeof(ZhangWuji);
var attr = type.GetCustomAttribute<MasterLevelAttribute>();

Console.WriteLine(attr.Level); // 5

相当于你“扫描”了张无忌:

“哦!此人是 5 级高手!”

于是你可以根据这个等级做不同逻辑——
比如安排更高难度任务。

⑤ 为什么反射和特性经常一起用?

因为:

  • 特性 = 贴出来的信息
  • 反射 = 读取信息的手段
  • 两者结合 = 框架自动化

例如:

ASP.NET Core 控制器的路由:

[HttpGet("/user")]
public IActionResult GetUser() { }

反射读取 [HttpGet] 特性 → 生成路由表。

ORM 如 EFCore / FreeSql:

[Column(IsPrimary = true)]
public int Id { get; set; }

反射读取 → 自动生成 SQL 字段

自动注入 DI

[Service]
public class UserService { }

框架用反射扫描 → 自动注册

综合武侠理解总结

机制 武侠比喻 含义

反射 (天眼通,洞悉武功本质) ( 动态查看类、属性、方法、调用方法)

特性 (贴在弟子或秘籍上的标签) (提供额外信息,改变框架行为)

反射+[特性 (扫描标签并采取行动) (.NET框架自动化的核心)