C#零基础通关第十五篇:吃透特性Attribute与AOP编程,实现数据校验、权限拦截、架构解耦

发布时间:2026/6/5 7:35:06
C#零基础通关第十五篇:吃透特性Attribute与AOP编程,实现数据校验、权限拦截、架构解耦
上一篇我们彻底吃透了C# 反射机制掌握了运行时动态解析类、动态创建对象、操作属性和方法的核心能力终于看懂了.NET框架底层动态编程、解耦架构的核心原理彻底摆脱了硬编码固化思维。反射给了我们动态读取类信息、执行代码的能力但仅有反射还无法实现优雅的代码标记、功能植入、统一拦截。而本篇的特性Attribute就是反射的最佳搭档特性是.NET高阶编程的核心也是AOP面向切面编程、MVC路由、数据校验、权限拦截、日志记录、框架配置的底层基石。零基础带你从零吃透系统特性、自定义特性、特性反射读取、AOP实战让你从普通CRUD开发者进阶到会架构设计、代码解耦、统一横切逻辑的高阶程序员。一、特性核心认知到底什么是Attribute1. 通俗理解特性特性Attribute一种用于给代码元素打标记、附加额外信息的特殊类。我们可以给类、方法、属性、字段、参数任意代码元素贴上特性标签。通俗来说特性就是给代码写备注、加标签程序运行时通过反射读取标签实现额外功能。普通代码代码是什么就执行什么无法附加额外规则加特性代码代码本体不变通过标签新增校验、权限、日志、路由等附加功能。2. 特性的核心价值代码解耦将通用逻辑校验、日志、权限和业务逻辑分离不侵入业务代码极简标记一行特性标签即可赋予类/方法额外功能代码极度简洁框架底层核心ASP.NET Core路由、数据注解校验、过滤器、依赖注入全部基于特性实现支持AOP编程实现横切逻辑统一拦截无需重复编写冗余代码。3. 必备命名空间所有特性相关操作必须引入系统核心命名空间usingSystem;usingSystem.Reflection;二、系统内置特性新手必掌握的常用特性C# 内置了大量官方特性日常开发高频使用先学会用再学手写自定义特性。1. [Obsolete] 过期废弃特性用于标记过期、废弃、不推荐使用的方法或类编译器会主动提示警告项目迭代、版本升级必备。// 标记方法过期提示替换新方法[Obsolete(该方法已过期请使用NewMethod()替代)]publicstaticvoidOldMethod(){Console.WriteLine(旧方法逻辑);}publicstaticvoidNewMethod(){Console.WriteLine(新方法逻辑);}// 调用时VS会出现绿色警告波浪线OldMethod();适用场景版本迭代废弃旧接口、旧方法兼容旧代码同时提示开发者升级。2. [Serializable] 序列化特性标记类支持序列化可实现对象二进制序列化、网络传输、本地持久化是对象存储和传输的基础特性。[Serializable]publicclassUser{publicintId{get;set;}publicstringUserName{get;set;}}3. 数据校验内置特性EF/表单常用System.ComponentModel.DataAnnotations 提供大量数据校验特性用于自动校验实体数据合法性。usingSystem.ComponentModel.DataAnnotations;publicclassStudent{// 不能为空[Required(ErrorMessage姓名不能为空)]publicstringName{get;set;}// 数值范围限制[Range(0,100,ErrorMessage分数必须在0-100之间)]publicintScore{get;set;}// 字符串长度限制[MaxLength(20,ErrorMessage账号长度不能超过20位)]publicstringAccount{get;set;}}这是后端接口、表单校验、EF实体约束的原生实现底层全部是特性反射原理。三、核心重点手写自定义特性全程实战系统内置特性只能满足基础需求真实项目中自定义特性才是我们开发的核心可根据业务需求自定义标签、自定义规则。1. 自定义特性固定规则自定义特性类必须继承 Attribute 基类特性类命名后缀必须以 Attribute 结尾规范标记特性可作用的目标类、方法、属性使用 [AttributeUsage] 约束。2. 实战案例自定义权限校验特性需求自定义一个权限特性标记方法需要管理员权限才能执行无权限则拦截提示。// 1. 约束该特性只能标记【方法】且允许重复标记[AttributeUsage(AttributeTargets.Method,AllowMultipletrue)]publicclassPermissionAttribute:Attribute{// 自定义属性需要的权限名称publicstringPermissionName{get;set;}// 构造函数传参publicPermissionAttribute(stringpermissionName){PermissionNamepermissionName;}}3. 给方法打上自定义特性标签publicclassOrderService{// 给下单方法标记需要订单管理权限[Permission(订单管理)]publicvoidCreateOrder(){Console.WriteLine(执行下单业务逻辑);}// 给删除方法标记需要订单删除权限[Permission(订单删除)]publicvoidDeleteOrder(){Console.WriteLine(执行删除订单业务逻辑);}}现在我们已经给不同方法打上了权限标签接下来通过反射读取特性实现权限拦截。四、核心实战反射读取特性实现功能拦截特性只是标记本身不会执行任何逻辑必须配合反射读取标签信息才能实现校验、拦截、拓展功能。这也是特性反射的核心精髓标签做标记反射做执行。1. 反射读取特性信息classProgram{staticvoidMain(){// 模拟当前用户权限stringuserPermission订单管理;// 获取目标方法信息Typetypetypeof(OrderService);MethodInfomethodtype.GetMethod(CreateOrder);// 读取方法上的自定义特性varpermissionAttrmethod.GetCustomAttributePermissionAttribute();if(permissionAttr!null){// 校验用户权限if(userPermissionpermissionAttr.PermissionName){Console.WriteLine(权限校验通过);// 反射调用方法method.Invoke(newOrderService(),null);}else{Console.WriteLine($权限不足需要【{permissionAttr.PermissionName}】权限);}}else{// 无特性标记直接放行method.Invoke(newOrderService(),null);}}}运行效果用户拥有对应权限则执行方法无权限直接拦截无需在业务方法内写if判断彻底解耦五、高阶核心彻底搞懂AOP面向切面编程1. 什么是AOPAOP面向切面编程针对统一横切逻辑的编程思想。通俗对比OOP面向对象关注业务主体、封装业务逻辑AOP面向切面关注通用横切逻辑权限、日志、事务、校验统一拦截、统一处理。2. AOP解决的痛点传统开发每个方法都要写日志、判权限、异常捕获代码大量重复侵入业务逻辑AOP开发**业务代码只写业务通用逻辑统一切面拦截处理**。3. 基于特性反射实现极简AOP手写框架我们封装一个通用切面工具实现方法执行前校验权限、执行后记录日志全程不侵入业务代码。// 通用AOP切面工具类publicstaticclassAopHelper{/// summary/// 统一执行方法附带权限校验日志记录/// /summarypublicstaticvoidExecuteMethod(objectobj,stringmethodName,stringuserPermission){Typetypeobj.GetType();MethodInfomethodtype.GetMethod(methodName);// 1. 切面前置权限校验varattrmethod.GetCustomAttributePermissionAttribute();if(attr!nulluserPermission!attr.PermissionName){Console.WriteLine($【切面拦截】权限不足需要{attr.PermissionName});return;}// 2. 执行原始业务方法Console.WriteLine(【切面前置】方法开始执行);method.Invoke(obj,null);// 3. 切面后置日志记录Console.WriteLine($【切面后置】{methodName}方法执行完成已记录日志\r\n);}}// 调用测试classProgram{staticvoidMain(){OrderServiceorderServicenewOrderService();// 模拟有权限用户AopHelper.ExecuteMethod(orderService,CreateOrder,订单管理);// 模拟无权限用户AopHelper.ExecuteMethod(orderService,DeleteOrder,订单管理);}}4. 运行结果展示【切面前置】方法开始执行 执行下单业务逻辑 【切面后置】CreateOrder 方法执行完成已记录日志 【切面拦截】权限不足需要订单删除核心亮点业务代码干干净净没有任何权限、日志代码所有通用逻辑全部由切面统一处理这就是企业级框架的核心设计思想六、特性AOP项目高频应用场景学会这套组合你就看懂了绝大多数.NET框架功能的底层原理权限拦截接口标记权限特性切面统一拦截校验参数校验实体标记数据特性自动校验参数合法性日志记录方法执行前后统一记录操作日志、异常日志路由映射ASP.NET Core [HttpGet]/[HttpPost] 特性标记路由事务控制标记事务特性切面自动开启、提交、回滚事务缓存拦截查询方法标记缓存特性切面优先读取缓存提升性能。七、新手高频易错坑点必避特性只是标记单独写特性无任何效果必须配合反射读取、执行逻辑忘记约束使用范围自定义特性必须加 [AttributeUsage]避免乱用在不支持的代码元素上混淆AOP和业务通用横切逻辑放切面核心业务逻辑放方法内部职责分离过度使用特性简单判断、简单逻辑无需自定义特性避免过度设计反射性能问题高频执行的切面可缓存MethodInfo和特性信息避免重复反射解析。八、全文核心总结1.特性本质给代码元素打标签、附加元数据分为系统内置特性和自定义特性自定义特性规则继承Attribute基类通过AttributeUsage约束使用目标核心组合特性负责标记反射负责读取解析二者结合实现动态拓展功能AOP编程思想分离通用横切逻辑与业务逻辑实现代码解耦、统一拦截、极简开发项目价值是框架底层、权限系统、日志系统、数据校验的核心实现方案是进阶架构的必备能力。下期预告下一篇我们将开启项目实战阶段综合运用前面所有语法、集合、LINQ、IO、反射、特性AOP手把手带大家开发一个完整的控制台权限管理系统从零整合所有知识点实现从学语法到做项目的蜕变