注解与反射
一套“给代码贴标签 + 运行时读取标签并做事情”的机制。
什么是注解?
在 C# 里,“注解”就是 Attribute(特性)。
本质:一种附加在代码上的元数据(metadata)
比如:
1 | [] |
这里 [Obsolete] 就是一个 Attribute。
📌 常见用途
- 标记方法已过时
- 做权限控制
- ORM 映射(数据库字段)
- 序列化控制
- Web API 路由
- 单元测试标记
如何自定义Attribute?
- 定义 Attribute 类
1 | using System; |
关键:必须继承Attribute、可以带有构造函数参数、可以带有字段属性
2. 使用Attrubute
1 | public class Person |
什么是反射?
👉 反射就是:程序在运行时“查看自己”并操作自己
可以做到:
- 获取类型信息
- 获取属性 / 方法
- 调用方法
- 读取 Attribute
反射抓取Attribute
示例:
1 | using System; |
输出:
1 | Name -> 用户名 |
反射还能做什么?
- 创建对象
1 | var obj = Activator.CreateInstance(typeof(Person)); |
- 调用方法
1 | MethodInfo method = typeof(Person).GetMethod("SayHello"); |
- 设置属性
1 | PropertyInfo prop = typeof(Person).GetProperty("Name"); |
完整示例
“给属性贴标签 + 用反射读出来”
1 | using System; |
输出:
1 | 用户名: Alice |
为什么要这样做?
不用注解,写死:
1 | Console.WriteLine("用户名: " + p.Name); |
这样每个字段都要手写 ,改字段就要改代码 ,重复代码多
若使用用注解 + 反射(自动化),可以自动处理所有属性,新增字段不用改逻辑,更通用(可复用)
总而言之:
- 自动化:不用一个个写字段处理逻辑(少写代码)
- 解耦(重点!):把数据和逻辑分开,在属性上写规则(注解),而逻辑统一用反射处理
- 可扩展,比如新增一个属性:
1 | [] |
不用改任何逻辑代码,自动支持
属性上写规则(标签)
程序自动读规则执行
缺点:降低性能与代码可读性