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

【.NET Core】特性(Attribute)详解

【.NET Core】特性(Attribute)详解

文章目录

  • 【.NET Core】特性(Attribute)详解
    • 一、概述
    • 二、编写自定义属性
      • 2.1 自定义特性的主要步骤
      • 2.2 应用AttributeUsageAttribute
        • AttributeTargets 成员
        • Inherited属性
        • AllowMultiple属性
    • 三、声明特性类
    • 四、声明构造函数特性类
    • 五、声明属性的特性类
    • 六、自定义特性示例
    • 七、总结
    • 八、参考

一、概述

公共语言运行时添加类的关键描述性声明(称为特性),以便批注编程元素(如类型、字段、方法和属性)。编译运行时的代码时,它将被转换为中间语言(MSIL),并和编译器生成的元数据一起放置在可移植可执行文件内。特性使得将额外的描述信息放到可使用运行时反射服务提取的元数据中。当你声明派生自System.Attribute 的特殊类的实例时,编译器会创建特性。

在.NET内置了很多特性,这些特性描述数据序列化、指定用于强制安全性的特性并限制通过实时(JIT)编译器进行优化,来对代码进行调优。

二、编写自定义属性

2.1 自定义特性的主要步骤

  1. 应用AttributeUsageAttribute
  2. 声明特性类
  3. 声明构造函数
  4. 声明属性

2.2 应用AttributeUsageAttribute

自定义属性声明以System.AttributeUsageAttribute属性开头,定义特性类的一些主要特性。

AttributeUsageAttribute包含下列三个成员,它们对创建自定义属性非常重要:AttributeTargetsInheitedAllowMultiple

AttributeTargets 成员
成员说明
All32767属性可以应用于任何应用程序元素。
Assembly1属性可应用于程序集。
Class4属性可应用于类。
Constructor32属性可应用于构造函数。
Delegate4096属性可应用于委托。
Enum16属性可应用于枚举。
Event512属性可应用于事件。
Field256属性可应用于字段。
GenericParameter16384属性可应用于泛型参数。目前,这个属性只能在C#,Micrsoft中间语言(MSIL)和emitted代码中。
Interface1024属性可应用于接口。
Method64属性可应用于方法。
Module2属性可应用于模块。模块指的是可移植的执行文件(.dll或.exe),而不是Visual Basic标准模块。
Parameter2048属性可应用于参数。
Property128属性可应用于属性。
ReturnValue8192属性可应用于返回值。
Struct8属性可应用于结构;也就是值类型。
Inherited属性

AttributeUsageAttribute.Inherited属性指明要对其应用属性的类的派生类能否继承此属性。此属性使用true(默认值)或false标志。

public class MyAttribute : Attribute
{//...
}
[AttributeUsage(AttributeTargets.Method, Inherited = false)]
public class YourAttribute : Attribute
{//...
}
AllowMultiple属性

AttributeUsageAttribute.AllowMultiple属性指明元素能否包含属性的多个实例。如果设置为true,则允许多个实例。如设置为false(默认值),那么只允许一个实例。

/// <summary>
/// AllowMultiple =false 不允许多个属性
/// </summary>
[AttributeUsage(AttributeTargets.Method,AllowMultiple =false)]
public class MyAttribute:Attribute
{///方法体
}
/// <summary>
/// AllowMultiple =false 允许多个属性
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MultipleMyAttribute : Attribute 
{///方法体
}

当应用这些特性的多个实例时,MyAttribute会生成编译器错误吗。以下代码示例显示MultipleMyAttribute的有效以及MyAttribute无效用法:

public class AttributeService
{// This produces an error.// Duplicates are not allowed.[MyAttribute()][MyAttribute()]public void Get() {}// This is valid.[MultipleMy][MultipleMy]public void Update() { }
}

如果AllowMultiple属性和Inherited属性都设置为true,从另一个类继承的类可以继承一个属性,并具有在同一个子类中应用相同属性的另一个实例。如果AllowMultiple设置为false,则父类中的所有特性的值将被子类中一特性的新实例覆盖。

三、声明特性类

应用AttributeUsageAttribute以后,开始定义属性的细节。特性类的声明类似与传统类的声明。如以下代码所示:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class,AllowMultiple =false)]
public class MyAttribute:Attribute
{///
}

此特性定义说明了以下几点:

  • 特性类必须声明为公共类。
  • 按照约定,特性类的名称以单词Attribute结束。官方虽然没有要求,但是扔建议执行此约定以保证可读性。应用特性时,可以选择是否包含单词Attribute
  • 所有特性类必须直接或间接从System.Attribute类继承。

四、声明构造函数特性类

和传统类类似,特性是通过构造函数初始化的。下面的代码段阐明了典型的特性构造函数。此公共构造函数采用一个参数,并设置一个等于其值的成员变量。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class,AllowMultiple =false)]
public class MyAttribute:Attribute
{private string myValue;public MyAttribute(string myValue){this.myValue = myValue;}
}

可以重载此构造函数以适应值的各种组合。如果你还未自定义特性类定义了属性,则在初始化该特性时可以使用命名参数和定位参数的组合。通常情况下,将所有必须的参数定义为定位参数,将所有可选的参数定义为命名参数。在这种情况下,没有必需的参数就无法初始化属性。其他所有参数都是可选参数。

五、声明属性的特性类

如果你想要定义一个命名参数,或者提供一种简单的方法来返回由特性存储的值,请声明属性。应将特性的属性声明为公共实例,此公告实体包含将返回的数据类型的描述。定义将保存属性值的变量,并将此变量与get和set方法相关联。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class,AllowMultiple =false)]
public class MyAttribute:Attribute
{public string AttributeName {get; set;} 
}

六、自定义特性示例

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class,AllowMultiple =false)]
public class MyAttribute:Attribute
{private string author;private DateTime data;private string version;public MyAttribute(string author, DateTime data){this.author = author;this.data = data;}public virtual string Author {get { return author; }}public virtual DateTime Data {get { return data; }}public string Version {get { return version; }set { version = value; }}
}

可以采用以下任意一种方法,调用自定义特性:

public class AttributeService
{[MyAttribute("AuthorName","2023-12-18 15:14:01")]public void Get(){}[MyAttribute("Author2","2023-12-18 16:14:49",Version="v1.0")]public void Update() { }     
}

七、总结

特性提供声明式编程能力,但是它们是一种元数据形式的代码,本身并不执行任何操作。可以通过反射来调用特性完成操作。

下一章将详解如何使用反射调用特性。

八、参考

  1. [利用特性扩展元数据](利用特性扩展元数据 | Microsoft Learn)
  2. [应用属性](应用特性 - .NET | Microsoft Learn)
  3. [编写自定义属性](编写自定义特性 - .NET | Microsoft Learn)

相关文章:

【.NET Core】特性(Attribute)详解

【.NET Core】特性&#xff08;Attribute&#xff09;详解 文章目录 【.NET Core】特性&#xff08;Attribute&#xff09;详解一、概述二、编写自定义属性2.1 自定义特性的主要步骤2.2 应用AttributeUsageAttributeAttributeTargets 成员Inherited属性AllowMultiple属性 三、声…...

【C++】POCO学习总结(十九):哈希、URL、UUID、配置文件、日志配置、动态库加载

【C】郭老二博文之&#xff1a;C目录 1、哈希 1.1 说明 std::map和std::set 的性能是&#xff1a;O(log n) POCO哈希的性能比STL容器更好&#xff0c;大约快两&#xff1b; POCO中对应std::map的是&#xff1a;Poco::HashMap&#xff1b; POCO中对应std::set的是 Poco::Hash…...

1846_安全SPI

Grey 全部学习内容汇总&#xff1a;GitHub - GreyZhang/g_embedded: some embedded basic knowledge. 1846_安全SPI SPI是一种常见的通信方式&#xff0c;在汽车电子中比较常用。但是如果涉及到安全相关的设计&#xff0c;可能得考虑更多。而SPI协议本身没有很好的标准化&am…...

SQL Server ,使用递归查询具有层级关系的数据。

假设我们有一个表格 Employees&#xff0c;其中包含员工的层级关系信息&#xff0c;每一行包括员工的ID、姓名以及上级员工的ID。 下面是一个示例表格及其数据&#xff1a; Employees ---------------------- EmployeeID | Name | ManagerID ---------------------- 1 …...

【参数汇总】mysql服务端/客户端常见优化参数

mysql服务端参数 1、innodb_buffer_pool_size &#xff08;innodb索引buffer pool缓冲区大小&#xff09; 默认大小为128M&#xff0c; 官方推荐其配置为系统内存的 50% 到 75% 。 一般innodb_buffer_pool_size要结合以下两个参数来设置&#xff1a; innodb_buffer_pool_ch…...

LeetCode 142. 环形链表 II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…...

Leetcode刷题笔记题解(C++):224. 基本计算器

思路&#xff1a; step 1&#xff1a;使用栈辅助处理优先级&#xff0c;默认符号为加号。 step 2&#xff1a;遍历字符串&#xff0c;遇到数字&#xff0c;则将连续的数字字符部分转化为int型数字。 step 3&#xff1a;遇到左括号&#xff0c;则将括号后的部分送入递归&#x…...

还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis

文章目录 前言一、&#x1f4d6;MyBatis简介1.Mybatis历史2.MyBatis特性3.对比&#xff08;其他持久化层技术&#xff09; 二、&#x1f4e3;搭建MyBatis1.开发环境2.创建maven工程3.创建MyBatis核心配置文件4.创建mapper接口5.创建MyBatis的映射文件6.通过junit测试功能7.加入…...

C# WPF上位机开发(树形控件在地图软件中的应用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们聊过图形软件的开发方法。实际上&#xff0c;对于绘制的图形&#xff0c;我们一般还会用树形控件管理一下。举个例子&#xff0c;一个地图…...

【华为】文档中命令行约定格式规范(命令行格式规范、命令行行为规范、命令行参数格式、命令行规范)

文章目录 命令行约定格式**粗体&#xff1a;命令行关键字***斜体&#xff1a;命令行参数*[ ]&#xff1a;可选配置{ x | y | ... } 和 [ x | y | ... ]&#xff1a;选项{ x | y | ... }* 和 [ x | y | ... ]*&#xff1a;多选项&<1-n>&#xff1a;重复参数#&#xff…...

Trie 字典树(c++)(前缀)

题目链接&#xff1a;用户登录 题目&#xff1a; 样例&#xff1a; 输入 5 3 aaa aba aabbaa abbbbb cdd aabba abc abab 输出 Y N N 思路&#xff1a; 根据题目意思&#xff0c;要用到 Trie 字典树算法。 Trie 字典树&#xff0c;顾名思义&#xff0c;“字典”&#xff0…...

全球移动通信(2G/3G/4G/5G)频谱分布情况

一、概述 随着通信技术的不断发展&#xff0c;全球各国都在积极推进2G、3G、4G、5G网络的建设和应用。根据FCC统计&#xff0c;目前全球移动通信频谱分布如下&#xff1a; 二、分布 &#xff08;一&#xff09;俄罗斯 2G&#xff1a;主要使用900MHz和1800MHz两个频段。其中&…...

【04】GeoScene导出海图或者电子航道图000数据成果

1创建一个带有覆盖面和定义的产品 如果你没有已存在的S-57数据&#xff0c;你可以通过捕捉新的产品覆盖范围&#xff08;多边形产品范围&#xff09;及其所需的产品定义信息&#xff08;产品元数据&#xff09;来为新产品创建基础。 注&#xff1a; 如果你已经有一个S-57数据…...

安卓端出现https请求失败(转)

背景# 某天早上&#xff0c;正在一个会议时&#xff0c;突然好几个同事被叫出去了&#xff1b;后面才知道&#xff0c;是有业务同事反馈到领导那里&#xff0c;我们app里面某个功能异常。 具体是这样&#xff0c;我们安卓版本的app是禁止截屏的&#xff08;应该是app里做了拦…...

appium2.0.1安装完整教程+uiautomator2安装教程

第一步&#xff1a;根据官网命令安装appium&#xff08;Install Appium - Appium Documentation&#xff09; 注意npm前提是设置淘宝镜像&#xff1a; npm config set registry https://registry.npmmirror.com/ 会魔法的除外。。。 npm i --locationglobal appium或者 npm…...

Hbase的Rowkey设计

Hbase的Rowkey设计 rowkey设计 # 1&#xff09;长度原则# 最大64KB&#xff0c;推荐长度10~100 byte# 最好设为8的倍数&#xff0c;能短则短&#xff0c;rowkey如果太长会影响性能。# 2&#xff09;唯一原则&#xff1a;rowkey应该具备唯一性# 3&#xff09;散列原则…...

软考机考考试第一批经验分享

由于机考的特殊性&#xff0c;考试环境与传统笔试环境有所不同。下面是与考试环境相关的总结&#xff1a; 草稿纸&#xff1a;考场提供足够数量的草稿纸&#xff0c;每位考生都会分发一张白纸作为草稿纸。在草稿纸上需要写上准考证号。如果不够用&#xff0c;可以向监考老师再次…...

架构简洁之道有感,谈谈软件组件聚合的张力

配图由腾讯混元助手生成 这篇文章介绍了软件架构设计中组件设计思想&#xff0c;围绕“组件间聚合的张力”这个有意思的角度&#xff0c;介绍了概念&#xff0c;并且结合架构设计示例对这个概念进行了进一步阐述。 组件聚合&#xff1f;张力&#xff1f;这标题&#xff0c;有种…...

计算机网络 网络层上 | IP数据报,IP地址,ICMP,ARP等

文章目录 1 网络层的两个层面2 网络协议IP2.1 虚拟互联网络2.2 IP地址2.2.1 固定分类编址方式2.2.2 无分类编制CIDR2.2.3 MAC地址和IP地址区别 2.3 地址解析协议ARP2.3.1 解析过程 2.4 IP数据报格式 3 IP层转发分组流程4 国际控制报文协议ICMP4.1 ICMP格式结构4.2 分类4.2.1 差…...

金智融门户(统一身份认证)同步数据至钉钉通讯录

前言:因全面使用金智融门户和数据资产平台,二十几个信息系统已实现统一身份认证和数据同步,目前单位使用的钉钉尚未同步组织机构和用户信息,职工入职、离职、调岗时都需要手工在钉钉后台操作,一是操作繁琐,二是钉钉通讯录更新不及时或经常遗漏,带来管理问题。通过金智融…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...