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