当前位置: 首页 > news >正文

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


上一篇我们彻底吃透了C# 反射机制,掌握了运行时动态解析类、动态创建对象、操作属性和方法的核心能力,终于看懂了.NET框架底层动态编程、解耦架构的核心原理,彻底摆脱了硬编码固化思维。

反射给了我们动态读取类信息、执行代码的能力,但仅有反射,还无法实现优雅的代码标记、功能植入、统一拦截。

而本篇的特性(Attribute),就是反射的最佳搭档!

特性是.NET高阶编程的核心,也是AOP面向切面编程、MVC路由、数据校验、权限拦截、日志记录、框架配置的底层基石。

零基础带你从零吃透系统特性、自定义特性、特性反射读取、AOP实战,让你从普通CRUD开发者,进阶到会架构设计、代码解耦、统一横切逻辑的高阶程序员。

一、特性核心认知:到底什么是Attribute?

1. 通俗理解特性

特性(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,AllowMultiple=true)]publicclassPermissionAttribute:Attribute{// 自定义属性:需要的权限名称publicstringPermissionName{get;set;}// 构造函数传参publicPermissionAttribute(stringpermissionName){PermissionName=permissionName;}}

3. 给方法打上自定义特性标签

publicclassOrderService{// 给下单方法标记:需要订单管理权限[Permission("订单管理")]publicvoidCreateOrder(){Console.WriteLine("执行下单业务逻辑");}// 给删除方法标记:需要订单删除权限[Permission("订单删除")]publicvoidDeleteOrder(){Console.WriteLine("执行删除订单业务逻辑");}}

现在我们已经给不同方法打上了权限标签,接下来通过反射读取特性,实现权限拦截。

四、核心实战:反射读取特性,实现功能拦截

特性只是标记,本身不会执行任何逻辑,必须配合反射读取标签信息,才能实现校验、拦截、拓展功能。

这也是特性+反射的核心精髓:标签做标记,反射做执行

1. 反射读取特性信息

classProgram{staticvoidMain(){// 模拟当前用户权限stringuserPermission="订单管理";// 获取目标方法信息Typetype=typeof(OrderService);MethodInfomethod=type.GetMethod("CreateOrder");// 读取方法上的自定义特性varpermissionAttr=method.GetCustomAttribute<PermissionAttribute>();if(permissionAttr!=null){// 校验用户权限if(userPermission==permissionAttr.PermissionName){Console.WriteLine("权限校验通过!");// 反射调用方法method.Invoke(newOrderService(),null);}else{Console.WriteLine($"权限不足,需要【{permissionAttr.PermissionName}】权限");}}else{// 无特性标记,直接放行method.Invoke(newOrderService(),null);}}}

运行效果:用户拥有对应权限则执行方法,无权限直接拦截,无需在业务方法内写if判断,彻底解耦!

五、高阶核心:彻底搞懂AOP面向切面编程

1. 什么是AOP?

AOP(面向切面编程):针对统一横切逻辑的编程思想。

通俗对比:

  • OOP面向对象:关注业务主体、封装业务逻辑;

  • AOP面向切面:关注通用横切逻辑(权限、日志、事务、校验),统一拦截、统一处理。

2. AOP解决的痛点

传统开发:每个方法都要写日志、判权限、异常捕获,代码大量重复,侵入业务逻辑;

AOP开发:**业务代码只写业务,通用逻辑统一切面拦截处理**。

3. 基于特性+反射实现极简AOP(手写框架)

我们封装一个通用切面工具,实现:方法执行前校验权限、执行后记录日志,全程不侵入业务代码。

// 通用AOP切面工具类publicstaticclassAopHelper{/// <summary>/// 统一执行方法,附带权限校验+日志记录/// </summary>publicstaticvoidExecuteMethod(objectobj,stringmethodName,stringuserPermission){Typetype=obj.GetType();MethodInfomethod=type.GetMethod(methodName);// 1. 切面前置:权限校验varattr=method.GetCustomAttribute<PermissionAttribute>();if(attr!=null&&userPermission!=attr.PermissionName){Console.WriteLine($"【切面拦截】权限不足,需要:{attr.PermissionName}");return;}// 2. 执行原始业务方法Console.WriteLine("【切面前置】方法开始执行");method.Invoke(obj,null);// 3. 切面后置:日志记录Console.WriteLine($"【切面后置】{methodName}方法执行完成,已记录日志\r\n");}}// 调用测试classProgram{staticvoidMain(){OrderServiceorderService=newOrderService();// 模拟有权限用户AopHelper.ExecuteMethod(orderService,"CreateOrder","订单管理");// 模拟无权限用户AopHelper.ExecuteMethod(orderService,"DeleteOrder","订单管理");}}

4. 运行结果展示

【切面前置】方法开始执行 执行下单业务逻辑 【切面后置】CreateOrder 方法执行完成,已记录日志 【切面拦截】权限不足,需要:订单删除

核心亮点:业务代码干干净净,没有任何权限、日志代码,所有通用逻辑全部由切面统一处理,这就是企业级框架的核心设计思想!

六、特性+AOP项目高频应用场景

学会这套组合,你就看懂了绝大多数.NET框架功能的底层原理:

  • 权限拦截:接口标记权限特性,切面统一拦截校验;

  • 参数校验:实体标记数据特性,自动校验参数合法性;

  • 日志记录:方法执行前后统一记录操作日志、异常日志;

  • 路由映射:ASP.NET Core [HttpGet]/[HttpPost] 特性标记路由;

  • 事务控制:标记事务特性,切面自动开启、提交、回滚事务;

  • 缓存拦截:查询方法标记缓存特性,切面优先读取缓存,提升性能。

七、新手高频易错坑点(必避)

  • 特性只是标记:单独写特性无任何效果,必须配合反射读取、执行逻辑;

  • 忘记约束使用范围:自定义特性必须加 [AttributeUsage],避免乱用在不支持的代码元素上;

  • 混淆AOP和业务:通用横切逻辑放切面,核心业务逻辑放方法内部,职责分离;

  • 过度使用特性:简单判断、简单逻辑无需自定义特性,避免过度设计;

  • 反射性能问题:高频执行的切面可缓存MethodInfo和特性信息,避免重复反射解析。

八、全文核心总结

1.特性本质:给代码元素打标签、附加元数据,分为系统内置特性和自定义特性;

  1. 自定义特性规则:继承Attribute基类,通过AttributeUsage约束使用目标;

  2. 核心组合:特性负责标记,反射负责读取解析,二者结合实现动态拓展功能;

  3. AOP编程思想:分离通用横切逻辑与业务逻辑,实现代码解耦、统一拦截、极简开发;

  4. 项目价值:是框架底层、权限系统、日志系统、数据校验的核心实现方案,是进阶架构的必备能力。

下期预告

下一篇我们将开启项目实战阶段,综合运用前面所有语法、集合、LINQ、IO、反射、特性AOP,手把手带大家开发一个完整的控制台权限管理系统,从零整合所有知识点,实现从学语法到做项目的蜕变!

http://www.jsqmd.com/news/943524/

相关文章:

  • TestDisk与PhotoRec:免费开源数据恢复双雄的完整使用指南
  • 不止于杀毒:火绒安全这些隐藏功能,才是电脑高手的秘密武器
  • 跨平台无障碍设计实践:从Web、VR到教室的包容性交互框架
  • Java流程控制语句详解
  • 告别手动标注!用SAM(Segment Anything)自动生成COCO格式数据集,实测避坑指南
  • 2026巴中市本地黄金回收铂金白银回收哪家强?TOP5 正规门店榜单 + 联系方式 - 中安检金银铂钻回收
  • 荆门市地区2026年权威甄选:黄金回收白银铂金回收优质门店 TOP5 含详细电话 - 诚金汇钻回收公司
  • 想选国内余热锅炉销售厂家?这几家值得你重点关注!
  • ‘三区三线’永农图斑编号避坑指南:ArcGIS三种方法实测,哪种最快最合规?
  • ThinkPad风扇控制终极指南:TPFanCtrl2双风扇管理工具详解
  • 你的AI工具还在“手动续订”?3个信号表明智能订阅整合已刻不容缓(附ROI测算Excel自动模型)
  • 基于ESP32与MicroPython的离线小恐龙游戏机开发全解析
  • 深度解析:SUSFS4KSU-Module内核级Root隐藏的3大核心技术
  • 一键备份QQ空间历史说说:GetQzonehistory完整使用指南
  • CISA KEV紧急收录Oracle WebLogic漏洞 + Android一次性修复124个漏洞:中间件与移动端攻击链完整复盘
  • WarcraftHelper终极指南:如何让经典魔兽争霸3在现代PC上完美运行
  • 别只盯着CNN/RNN了!用DBN+Python搞定你的第一个无监督特征提取项目
  • 真空搅拌机选型完全指南(2026版):从需求分析到设备落地 - 上海奎特机电
  • 当打印机成为“部门墙”:矮萝卜如何打通文印管理最后一公里
  • HoloDesk深度解析:从AR交互原理到实时物理模拟的工程实践
  • 【会议征稿通知 | 四川大学计算机学院主办 | IEEE出版 | EI 、Scopus稳定检索】第九届计算机信息科学与应用技术国际学术会议(CISAT 2026)
  • 2026年PDF合并教程:小程序+在线+WPS,一看就会的合并方法 - 软件小管家
  • 4.5 传统ML与LLM的边界:什么时候用哪个
  • 计算机毕业设计之基于Hive的网易云音乐可视化系统的设计与实现
  • AI社交整合失效的5大隐形陷阱(92%的运营人正在踩坑):从数据孤岛到行为预测的闭环重建
  • 基于STM32与RFM95的LoRa无线通信系统DIY指南
  • 拯救你的B站缓存视频:m4s-converter如何让珍贵内容重获新生
  • SSL 证书检查:网站 HTTPS 的“体检报告”,过期前再也不用手忙脚乱
  • 保姆级教程:手把手教你从中国移动云盘下载并安装Matlab 2023b(附文件安装密钥与替换bin文件夹避坑指南)
  • 2026年OpenClaw平替工具排行榜TOP5:同时满足金融级安全标准+内网隔离+本地化部署的厂商推荐 - 品牌2026