反射(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框架自动化的核心)