全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C#如何实现自定义Attribute(特性)?元数据编程在C#中的高级应用

自定义Attribute需继承System.Attribute并可用AttributeUsage限定作用目标,通过反射在运行时读取,实现如权限控制、日志记录等横切关注点的声明式编程。

在C#中,自定义Attribute(特性)是一种强大的元数据编程手段,允许开发者将声明性信息附加到代码元素上,如类、方法、属性等。这些信息可以在运行时通过反射读取并执行相应逻辑,广泛应用于序列化、权限验证、日志记录、AOP(面向切面编程)等场景。

如何定义自定义Attribute

要创建一个自定义特性,需要定义一个继承自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;
    }
}

  • AttributeTargets.Method 表示只能用在方法上
  • AllowMultiple = false 禁止同一个元素重复添加该特性
  • Inherited = true 允许派生类继承基类上的特性

在运行时通过反射读取特性信息

定义完特性后,可在运行时通过反射检查某个成员是否被标记,并获取其数据,从而决定程序行为。

示例:检查方法是否需要特定权限

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 权限");
}

高级应用场景:结合AOP实现拦截逻辑

虽然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小时内与您取得联系。