C#中用于控制自定义特性(Attribute)

news2025/6/10 10:06:33

我们来详细解释一下 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 这个 C# 属性。
在 C# 中,Attribute(特性)是一种用于向程序元素(如类、方法、属性等)添加元数据的机制。AttributeUsage 是一个特殊的、用于定义其他自定义特性如何被使用的元特性。
让我们分解 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]

  1. [AttributeUsage(...)]:
    • 这是一个元特性,它被应用到一个自定义特性的定义上。
    • 它的作用是告诉编译器和开发人员,这个自定义特性应该如何被使用,以及有哪些限制。
  2. AttributeTargets.Class:
    • 这是 AttributeUsage 构造函数的第一个参数,类型是 AttributeTargets
    • AttributeTargets 是一个枚举类型,它定义了一系列的值,代表程序中的不同元素类型,例如类、结构、方法、属性、字段等。
    • AttributeTargets.Class 指定了这个自定义特性只能被应用在上。
    • 如果你想让特性可以应用在多个类型上,可以使用按位或运算符 | 来组合,例如 AttributeTargets.Class | AttributeTargets.Struct 表示可以应用在类或结构上。
  3. AllowMultiple = false:
    • 这是 AttributeUsage 构造函数的第二个参数(或者通过属性名称指定)。
    • 它是一个布尔值,控制是否允许同一个目标元素上应用多个相同类型的自定义特性。
    • false 表示不允许。一个类上只能有一个这种类型的特性。
    • true 表示允许。一个类上可以有多个这种类型的特性(例如,一个方法可以有多个 [Obsolete] 特性,每个特性可以带有不同的消息)。
  4. Inherited = false:
    • 这是 AttributeUsage 构造函数的第三个参数(或者通过属性名称指定)。
    • 它是一个布尔值,控制这个自定义特性是否会被继承
    • false 表示不继承。如果这个特性被应用在一个基类上,那么派生类不会自动拥有这个特性。
    • true 表示继承。如果这个特性被应用在一个基类上,那么派生类自动继承这个特性(默认值就是 true)。
      总结表格
      表格

举例说明
假设我们定义一个自定义特性 [DeveloperInfo],用于标记类的开发者信息,并且我们希望:

  1. 这个特性只能用在类上。
  2. 一个类上只能有一个 [DeveloperInfo] 特性。
  3. 这个特性不会被派生类继承。
    那么我们可以这样定义它:
// 定义自定义特性 DeveloperInfo
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class DeveloperInfoAttribute : Attribute
{
    public string Name { get; }
    public string Date { get; }
    public DeveloperInfoAttribute(string name, string date)
    {
        Name = name;
        Date = date;
    }
}

现在,我们使用这个特性:

// 应用特性
[DeveloperInfo("张三", "2023-10-27")]
public class MyImportantClass
{
    // 类的实现
    public void DoSomething() { }
}
// 尝试在同一个类上应用第二个 DeveloperInfo 特性 - 编译错误!
// [DeveloperInfo("李四", "2023-10-28")] // 因为 AllowMultiple = false
// public class AnotherClass { } // 这行代码本身没问题,但上面这行会出错
// 尝试在方法上应用 - 编译错误!
// [DeveloperInfo("王五", "2023-10-29")]
// public void SomeMethod() { } // 因为 AttributeTargets 只指定了 Class
// 派生类不会继承基类的 DeveloperInfo 特性
public class DerivedClass : MyImportantClass
{
    // 这个类上没有 DeveloperInfo 特性,即使基类 MyImportantClass 有
    public void DoAnotherThing() { }
}

另一个例子:允许重复且可继承的特性
假设我们定义一个 [Tag] 特性,用于给类打标签,一个类可以有多个标签,并且这些标签会被派生类继承。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class TagAttribute : Attribute
{
    public string TagName { get; }
    public TagAttribute(string tagName)
    {
        TagName = tagName;
    }
}
// 应用特性
[Tag("Utility")]
[Tag("Helper")]
[Tag("Core")]
public class UtilityClass
{
    // ...
}
// 派生类会继承基类的 Tag 特性
public class AdvancedUtilityClass : UtilityClass
{
    // 这个类自动拥有了 "Utility", "Helper", "Core" 三个标签
    // 也可以添加自己的标签
    [Tag("Advanced")]
    // ...
}

通过 AttributeUsage,你可以精确控制自定义特性的使用范围和行为,使其更符合设计意图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】

1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…

项目进度管理软件是什么?项目进度管理软件有哪些核心功能?

无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除

目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作&#xf…

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递

在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…

java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟

众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了,延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp ,边缘服务器拉流推送到云服务器 …

免费批量Markdown转Word工具

免费批量Markdown转Word工具 一款简单易用的批量Markdown文档转换工具,支持将多个Markdown文件一键转换为Word文档。完全免费,无需安装,解压即用! 官方网站 访问官方展示页面了解更多信息:http://mutou888.com/pro…

以太网PHY布局布线指南

1. 简介 对于以太网布局布线遵循以下准则很重要,因为这将有助于减少信号发射,最大程度地减少噪声,确保器件作用,最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确,然…

若依项目部署--传统架构--未完待续

若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加,传统开发模式存在效率低,重复劳动多等问题。若依项目通过整合主流技术框架&…

华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手

华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…

MeanFlow:何凯明新作,单步去噪图像生成新SOTA

1.简介 这篇文章介绍了一种名为MeanFlow的新型生成模型框架,旨在通过单步生成过程高效地将先验分布转换为数据分布。文章的核心创新在于引入了平均速度的概念,这一概念的引入使得模型能够通过单次函数评估完成从先验分布到数据分布的转换,显…

【Vue】scoped+组件通信+props校验

【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性, 令样式只作用于当前组件的标签 作用:防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…

构建Docker镜像的Dockerfile文件详解

文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…

从0开始学习R语言--Day17--Cox回归

Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…

ABAP设计模式之---“Tell, Don’t Ask原则”

“Tell, Don’t Ask”是一种重要的面向对象编程设计原则,它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则? 这个原则的核心思想是: “告诉一个对象该做什么,而不是询问一个对象的状态再对它作出决策。…

虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)

当我们网关配置好了,DNS也配置好了,最后在虚拟机里还是无法访问百度的网址。 第一种情况: 我们先考虑一下,网关的IP是否和虚拟机编辑器里的IP一样不,如果不一样需要更改一下,因为我们访问百度需要从物理机…

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S(Inter-Integrated Circuit Sound)是一种用于传输数字音频数据的通信协议,广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设,通过配置…

break 语句和 continue 语句

break语句和continue语句都具有跳转作用&#xff0c;可以让代码不按既有的顺序执行 break break语句用于跳出代码块或循环 1 2 3 4 5 6 for (var i 0; i < 5; i) { if (i 3){ break; } console.log(i); } continue continue语句用于立即终…

【Linux】使用1Panel 面板让服务器定时自动执行任务

服务器就是一台24小时开机的主机&#xff0c;相比自己家中不定时开关机的主机更适合完成定时任务&#xff0c;例如下载资源、备份上传&#xff0c;或者登录某个网站执行一些操作&#xff0c;只需要编写 脚本&#xff0c;然后让服务器定时来执行这个脚本就可以。 有很多方法实现…

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总&#xff08;最简化&#xff09;_底部的附件列表中】: ffmpeg - lzip…