自定义Attribute需继承System.Attribute并可用AttributeUsage限定作用目标,通过反射在运行时读取,实现如权限控制、日志记录等横切关注点的声明式编程。
在C#中,自定义Attribute(特性)是一种强大的元数据编程手段,
允许开发者将声明性信息附加到代码元素上,如类、方法、属性等。这些信息可以在运行时通过反射读取并执行相应逻辑,广泛应用于序列化、权限验证、日志记录、AOP(面向切面编程)等场景。
要创建一个自定义特性,需要定义一个继承自System.Attribute的类。命名惯例是将类名以“Attribute”结尾,但在使用时可以省略该后缀。
示例:定义一个用于标记需要权限验证的方法特性
public class RequirePermissionAttribute : Attribute
{
public string Permission { get; }
public RequirePermissionAttribute(string permission)
{
Permission = permission;
}
}
这个特性只能用于方法,但默认情况下它可以应用于任何程序元素。为了限制使用范围,可以使用AttributeUsage特性进行约束。
通过AttributeUsage指定特性可应用的目标元素类型、是否允许多次使用以及是否继承到派生类。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class RequirePermissionAttribute : Attribute
{
public string Permission { get; }
public RequirePermissionAttribute(string permission)
{
Permission = permission;
}
}
定义完特性后,可在运行时通过反射检查某个成员是否被标记,并获取其数据,从而决定程序行为。
示例:检查方法是否需要特定权限
public static bool HasPermissionRequirement(MethodInfo method, string requiredPermission)
{
var attr = method.GetCustomAttribute();
return attr != null && attr.Permission == requiredPermission;
}
使用方式:
public class OrderService
{
[RequirePermission("ManageOrders")]
public void DeleteOrder(int orderId)
{
// 删除订单逻辑
}
}
// 调用时检查权限
var method = typeof(OrderService).GetMethod("DeleteOrder");
if (HasPermissionRequirement(method, "ManageOrders"))
{
Console.WriteLine("该方法需要 ManageOrders 权限");
}
虽然C#本身不直接支持方法拦截,但结合特性与动态代理(如Castle DynamicProxy)或源生成器(Source Generator),可以实现类似AOP的功能。
例如,在ASP.NET Core中,AuthorizeAttribute就是典型的自定义特性应用——控制器或动作方法被打上该特性后,请求会先经过授权中间件验证。
你也可以设计一个日志特性:
public class LogExecutionTimeAttribute : Attribute { }
配合依赖注入和拦截机制,在方法执行前后自动记录耗时(需借助第三方库或编译期工具)。
基本上就这些。自定义Attribute + 反射构成了C#元数据驱动编程的核心,合理使用能让代码更清晰、扩展性更强。关键在于把横切关注点(如权限、日志、验证)从主业务逻辑中解耦出来,提升可维护性。
# 工具
# proxy
# c#
# 权限验证
# 动态代理
# .net
# red
# 中间件
# 继承
# AttributeUsage
# Attribute
# 自定义
# 应用于
# 是一种
# 派生类
# 横切
# 但在
# 可在
# 能让
# 它可以
# 可以使用
相关文章:
建站OpenVZ教程与优化策略:配置指南与性能提升
建站主机空间推荐 高性价比配置与快速部署方案解析
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何获取上海专业网站定制建站电话?
存储型VPS适合搭建中小型网站吗?
Java解压缩zip - 解压缩多个文件或文件夹实例
网站设计制作公司地址,网站建设比较好的公司都有哪些?
建站之星安装后如何配置SEO及设计样式?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
建站主机选虚拟主机还是云服务器更好?
网站制作说明怎么写,简述网页设计的流程并说明原因?
如何确认建站备案号应放置的具体位置?
如何在橙子建站上传落地页?操作指南详解
建站之星展会模板:智能建站与自助搭建高效解决方案
股票网站制作软件,网上股票怎么开户?
如何在云主机快速搭建网站站点?
网站专业制作公司有哪些,做一个公司网站要多少钱?
如何快速重置建站主机并恢复默认配置?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
如何选择高性价比服务器搭建个人网站?
建站之星后台管理:高效配置与模板优化提升用户体验
大连网站设计制作招聘信息,大连投诉网站有哪些?
制作企业网站建设方案,怎样建设一个公司网站?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何注册花生壳免费域名并搭建个人网站?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
如何登录建站主机?访问步骤全解析
如何通过商城自助建站源码实现零基础高效建站?
利用JavaScript实现拖拽改变元素大小
盘锦网站制作公司,盘锦大洼有多少5G网站?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
网站制作企业,网站的banner和导航栏是指什么?
招贴海报怎么做,什么是海报招贴?
网站微信制作软件,如何制作微信链接?
如何快速生成专业多端适配建站电话?
深圳网站制作培训,深圳哪些招聘网站比较好?
焦点电影公司作品,电影焦点结局是什么?
如何在宝塔面板创建新站点?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
Bpmn 2.0的XML文件怎么画流程图
,购物网站怎么盈利呢?
建站主机默认首页配置指南:核心功能与访问路径优化
建站之星官网登录失败?如何快速解决?
高端云建站费用究竟需要多少预算?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
实例解析Array和String方法
如何在景安云服务器上绑定域名并配置虚拟主机?
*请认真填写需求信息,我们会在24小时内与您取得联系。