总结一下 C# 如何自定义特性 Attribute 并进行应用

image

前言

Attribute(特性)是一种用于为程序元素(如类、方法、属性等)提供元数据信息的方法。

特性是一种声明式的信息,附加到程序元素上,提供额外的数据用于描述和控制这些元素的行为。

在编译和运行时,都可以读取特性提供的信息对程序元素进行分析和操作。

特性通常用于实现以下功能:

  1. 为代码添加元数据信息:特性为元素(类、方法、属性等)添加额外的元数据信息,描述其用途、状态、约束等。

  2. 控制编译行为:特性可以用于控制编译器对代码的处理,如指示编译器生成额外的代码、忽略特定警告等。

  3. 在运行时进行反射操作:特性可以在运行时通过反射获取并读取,用于实现一些动态的行为,如配置加载、权限检查等。

C# 本身提供了一些常用的特性,如 SerializableObsoleteConditional 等,同时我们也可以自定义特性来满足特定的需求。

特性的应用范围非常广泛,在实际开发中经常用于标记和控制程序的行为,提高代码的可读性和灵活性。

下面看看如何自定义特性 Attribute 并进行应用。

Step By Step 步骤:

  1. 创建一个 ASP.NET Core Web Api 项目

  2. 创建一个 Attribute

    namespace AttributeSample
    {// 说明此特性应用在属性上[AttributeUsage(AttributeTargets.Property)]public class TestAttribute: Attribute{public string DisplayName { get; set; }public int DisplayWidth { get; set; }public TestAttribute(string displayName, int displayWidth){DisplayName = displayName;DisplayWidth = displayWidth;}}
    }
    
  3. 创建一个类,应用这个 Attribute

    public class Points
    {[Test("站点名称", 100)]public string StationNo { get; set; }[Test("P1数据名称", 100)]public float TD_P1 { get; set; }[Test("P2数据名称", 100)]public float TD_P2 { get; set; }
    }
    
  4. 在控制器中读取 Points 类的属性的特性的值并应用

    namespace AttributeSample.Controllers
    {[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private readonly ILogger<WeatherForecastController> _logger;public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;// 获取 Attribute 内容Type t = typeof(Points);foreach (PropertyInfo pi in t.GetProperties()){string propertyName = pi.Name;string displayName = pi.GetCustomAttribute<TestAttribute>()?.DisplayName!;int displayWidth = pi.GetCustomAttribute<TestAttribute>().DisplayWidth;// 读取类属性的特性值之后,可以进行一些操作,这里是打印出来_logger.LogInformation("属性名称:" + propertyName + ";显示名称:" + displayName + ";显示宽度:" + displayWidth);}}......}
    

总结

  1. Attrbiute 本身只是 “标签”,脱离了通过反射操作它的代码逻辑,它什么也不是
  2. Attribute 本身,就是个标记,没什么功能。但是,别的工具、框架(比如上面的控制器)在做事的时候,会看相关的 Attribute,做相应的处理。这是最主要的作用
  3. 总的来说就是可以用 Attribute 给代码元素(类,方法,成员变量,属性 等等)打个标签,附加一些信息,在调用这些代码的时候利用反射取出这些信息并根据这些信息做些不同的事情
  4. Attribute 一定是配合反射使用的。也就说,你看不到的外层框架性代码一定有调用反射去寻找这些 Attribute。
  5. 可以利用 Attribute 更好地解耦业务,更好地符合单一职责原则,比如一个方法要实现三个业务场景,保存数据之后要发送一个邮件和发送一个消息,就可以在方法中只做保存数据的业务场景,利用 Attribute 来实现发送邮件和消息的业务场景。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。

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

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

相关文章

Git快速上手

初识Git 是一个免费开源, 分布式的代码版本控制系统, 帮助开发团队维护代码 作用: 记录代码内容,切换代码版本,多人开发时高效合并代码内容 Git和GitHub Git是一个软件, Github是一个网站,两者的功能都是提供版本控制服务. 官网: GitHub: Let’s build from here GitHub …

oracle12c到19c adg搭建(三)oracle19c数据库软件安装

由于这里的19c是做备库所以我们只安装软件不用创建实例&#xff0c;实例由主库同步过来 解压软件到安装目录 注意19c得db要直接解压到19c得软件安装目录 [rooto12u19p software]# ls V982063-01.zip [rooto12u19p software]# ls -ll total 2987996 -rw-r--r-- 1 root ro…

MongoDB入门与实践

MongoDB是一个NoSQL数据库&#xff0c;它采用文档模型来存储数据&#xff0c;具有高性能、易扩展、灵活的特点。以下是MongoDB的入门指南和一些基本的实践示例&#xff0c;帮助你开始使用MongoDB。 1. 安装和基本配置 安装MongoDB 具体安装方法取决于你的操作系统。以Ubuntu…

R语言数据分析案例:探索在线零售数据集

R语言数据分析案例&#xff1a;探索在线零售数据集 一、引言 在当今数据驱动的时代&#xff0c;数据分析成为了各个领域中不可或缺的一部分。R语言作为一款强大的统计分析工具&#xff0c;广泛应用于数据清洗、探索性数据分析、数据可视化以及预测建模等方面。本案例将使用R语…

【css】创建一个带有上矩形和下倒三角角标

涉及到的主要CSS属性&#xff1a; clip-path&#xff1a;使用CSS剪切路径属性创建上矩形和下倒三角形的形状。 transform: scale(0.8);&#xff1a;缩小角标的大小&#xff0c;使其看起来更协调。完整html及css: <!DOCTYPE html> <html lang"en"><h…

java-System 概述 2

### 6. System类的设计原则 System类的设计体现了许多Java设计原则&#xff0c;包括封装、单一职责、模块化和高内聚性。以下是一些具体的设计原则和它们在System类中的体现&#xff1a; #### 6.1 封装 封装是面向对象编程的基本原则之一&#xff0c;它通过隐藏对象的内部实…

RSA加密Java与Python通用版

前情提要&#xff1a;架构中有两个系统&#xff0c;一个JAVA,一个PYTHON&#xff0c;之间的数据传输需要进行加密解密。 于是做了一个统一的工具。两系统之间可以相互加解密。 目录 一、JAVA 二、PYTHON 一、JAVA <!-- https://mvnrepository.com/artifact/org.bouncycas…

PAT B1008. 数组元素循环右移问题

题目描述 一个数组A中存有N(N>O)个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M(M≥0)个位置,即将A中的数据由( …)变换为(……)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,则应如何设计移动的方法?输…

Harbor本地仓库搭建002_Harbor负载均衡节点搭建_nginx安装配置_harbor安装---分布式云原生部署架构搭建002

负载均衡的机器. 可以看到上面是安装nginx的过程 首先去编辑一下yum仓库地址,配置一下nginx的仓库地址 然后这个是配置的内容 然后在进行安装之前最好yum makecache fast 更新一下缓存,这样安装的时候 会安装最新的包 然后就可以安装nginx yum -y install nginx 然后去

设备档案包括哪些内容

设备档案通常包括以下内容和要求&#xff1a; 1. 设备基本信息&#xff1a;包括设备名称、型号、规格、生产厂商、出厂日期、购买日期等。 2. 设备安装信息&#xff1a;包括设备的安装位置、安装日期、安装人员等。 3. 设备维护信息&#xff1a;包括设备的维护保养记录&#xf…

C++类与对象、类的6个默认成员函数、构造函数、析构函数等的介绍

文章目录 前言一、类的6个默认成员函数二、构造函数1. 概念2. 特性1. 无参构造函数2. 带参构造函数3. 编译器默认生成的无参构造函数 3. 构造函数的初始化4. 默认构造函数 三、析构函数1. 概念2. 特性3. 编译器默认生成的析构函数的作用4. 构造函数的使用 总结 前言 C类与对象…

GLM4-9B-Chat模型LoRA微调

文本记录GLM4-9B-Chat模型进行LoRA微调的过程。 一、环境&#xff1a; 操作系统: Ubuntu 22.04CUDA: 12.1GPU: 3090 x 2 创建conda环境&#xff1a; conda create -n glm4 python3.10.14 conda activate glm4cd /home/data/chatglm4-finetune 二、数据准备 运行d…

Java学习 - Docker管理和容器命令 实例

docker管理 查看docker版本&#xff0c;检测是否可用 sudo docker version查看docker 系统信息 sudo docker infodocker容器命令 容器状态 容器标识 容器长uuid容器短uuid容器名字 查看容器状态 sudo docker status [容器标识1] [容器标识2] [容器标识n]深入查看容器信息 su…

docker容器中连接宿主机mysql数据库

最近要在docker中使用mysql数据库&#xff0c;首先考虑在ubuntu的镜像中安装mysql&#xff0c;这样的脚本和数据库都在容器中&#xff0c;直接访问localhost&#xff1a;3306&#xff0c;脚本很简单&#xff0c;如下&#xff1a; import pymysql# 建立数据库连接 db pymysql.…

HTML5基本语法

文章目录 HTML5基本语法一、基础标签1、分级标题2、段标签3、换行及水平线标签4、文本格式标签 二、图片标签1、格式2、属性介绍 三、音频标签1、格式2、属性介绍 四、视频标签1、格式2、属性介绍 五、链接标签1、格式2、显示特点3、属性介绍4、补充&#xff08;空链接&#xf…

虚设备与Spooling技术

虚设备&#xff08;Virtual Device&#xff09;和Spooling技术是操作系统中用于提高输入/输出&#xff08;I/O&#xff09;效率的两种技术。下面分别对它们进行解释&#xff1a; ### 虚设备&#xff08;Virtual Device&#xff09; 虚设备是一种软件技术&#xff0c;它允许多个…

安装stable-baselines3[extra]

新方法&#xff1a; %pip install AutoROM.accept-rom-license0.4.2 %pip install stable-baselines3[extra]旧方法&#xff1a; https://www.atarimania.com/rom_collection_archive_atari_2600_roms.html https://drive.google.com/file/d/1uuPaYGf2f4DaEUJkS36LvSEWokgC8qj…

拼多多,藏着水果版中国地图

越来越多人开始在拼多多买水果。在发现这个现象后&#xff0c;我询问他们同一个问题&#xff1a;“那你收到过烂掉的吗&#xff1f;” 几乎所有频繁下单的人都告诉我&#xff0c;收到过。他们在拼多多买全国各地的水果&#xff0c;偶尔收到烂掉的&#xff0c;但依然会继续在拼…

OpenCloudOS 8.8 一键安装 Oracle 11GR2 单机

前言 Oracle 一键安装脚本&#xff0c;演示 OpenCloudOS 8.8 一键安装 Oracle 11GR2 单机&#xff08;231017&#xff09;过程&#xff08;全程无需人工干预&#xff09;。 ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 安装准备 1、安装好操作系统&#xff0c;建…

工业物联网关为智能制造业提供哪些支撑?天拓四方

随着科技的飞速发展&#xff0c;智能制造业已成为工业领域的转型方向。在这一转变中&#xff0c;工业物联网关发挥着至关重要的作用。作为连接物理世界与数字世界的桥梁&#xff0c;工业物联网关不仅实现了设备与设备、设备与云平台之间的互联互通&#xff0c;更通过实时数据采…