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

前言
Attribute(特性)是一种用于为程序元素(如类、方法、属性等)提供元数据信息的方法。
特性是一种声明式的信息,附加到程序元素上,提供额外的数据用于描述和控制这些元素的行为。
在编译和运行时,都可以读取特性提供的信息对程序元素进行分析和操作。
特性通常用于实现以下功能:
-
为代码添加元数据信息:特性为元素(类、方法、属性等)添加额外的元数据信息,描述其用途、状态、约束等。
-
控制编译行为:特性可以用于控制编译器对代码的处理,如指示编译器生成额外的代码、忽略特定警告等。
-
在运行时进行反射操作:特性可以在运行时通过反射获取并读取,用于实现一些动态的行为,如配置加载、权限检查等。
C# 本身提供了一些常用的特性,如 Serializable、Obsolete、Conditional 等,同时我们也可以自定义特性来满足特定的需求。
特性的应用范围非常广泛,在实际开发中经常用于标记和控制程序的行为,提高代码的可读性和灵活性。
下面看看如何自定义特性 Attribute 并进行应用。
Step By Step 步骤:
-
创建一个 ASP.NET Core Web Api 项目
-
创建一个 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;}} } -
创建一个类,应用这个 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; } } -
在控制器中读取 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);}}......}
总结
- Attrbiute 本身只是 “标签”,脱离了通过反射操作它的代码逻辑,它什么也不是
- Attribute 本身,就是个标记,没什么功能。但是,别的工具、框架(比如上面的控制器)在做事的时候,会看相关的 Attribute,做相应的处理。这是最主要的作用
- 总的来说就是可以用 Attribute 给代码元素(类,方法,成员变量,属性 等等)打个标签,附加一些信息,在调用这些代码的时候利用反射取出这些信息并根据这些信息做些不同的事情
- Attribute 一定是配合反射使用的。也就说,你看不到的外层框架性代码一定有调用反射去寻找这些 Attribute。
- 可以利用 Attribute 更好地解耦业务,更好地符合单一职责原则,比如一个方法要实现三个业务场景,保存数据之后要发送一个邮件和发送一个消息,就可以在方法中只做保存数据的业务场景,利用 Attribute 来实现发送邮件和消息的业务场景。
我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。
都看到这了,求个点赞、关注、在看三连呗,感谢支持。
相关文章:
总结一下 C# 如何自定义特性 Attribute 并进行应用
前言 Attribute(特性)是一种用于为程序元素(如类、方法、属性等)提供元数据信息的方法。 特性是一种声明式的信息,附加到程序元素上,提供额外的数据用于描述和控制这些元素的行为。 在编译和运行时&…...
三种暴露方法和引入方式
1.分别暴露 export ...export...用于按需导出一个或多个模块,在导入时需要使用花括号指定导入的模块名称,例如import { a, b } from module module.js中 export let a 1 export function b(){console.log(hello,vue) } 2.统一暴露 export { ...}用于统…...
“Git之道:掌握常用命令,轻松管理代码“
目录 1. 初始化和配置 2. 提交和更新 3. 分支和合并 4. 查看和比较 5. 远程仓库 6. 文件操作命令 1. 初始化和配置 git init:在当前目录初始化一个新的Git仓库git config:配置Git的全局或局部选项git clone:从远程仓库克隆一个本地副本…...
Linux vim 文本编辑 操作文本 三种模式
介绍 vi 是一个经典的行编辑器,支持模式编辑(包括普通模式、插入模式和命令模式)。 vim 保留vi核心功能的基础上,增加了多级撤销、语法高亮、插件支持等高级功能。 两者的最大区别,简单的来说vim就是vi的增强版 三…...
JavaFX DatePicker
JavaFX DatePicker允许从给定日历中选择一天。DatePicker控件包含一个带有日期字段和日期选择器的组合框。JavaFX DatePicker控件使用JDK8日期时间API。 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.DatePicker; import j…...
开展“安全生产月”活动向媒体投稿的好方法找到了
作为一名单位的信息宣传员,我的职责是确保每一次重要活动的声音都能准确无误地传达到社会的每一个角落。在这样的使命驱动下,我曾一度陷入了一种传统的投稿模式——依赖电子邮件,将精心准备的稿件一封封地发送给各大媒体。初入此行,我满心以为这便是信息传播的路径,却未料到,这…...
商讯杂志商讯杂志社商讯编辑部2024年第10期目录
案例分享 基于胜任素质的干部选拔和梯队建设体系探讨——以A区卫生健康系统为例 康文雁; 1-4 “家庭五险一金”对居民商业保险购买存在挤出效应——基于江苏省徐州、淮安、泰州三市的实证研究 李炳毅; 5-8 人口老龄化背景下促进徐州市经济高质量发展的探究 李艳秋;…...
在VS Code中快速生成Vue模板的技巧
配置vue.json: { "Print to console": {"prefix": "vue","body": ["<template>"," <div class\"\">\n"," </div>","</template>\n","<scri…...
新火种AI|Sora发布半年之后,AI视频生成领域风云再起
作者:一号 编辑:美美 AI视频最近有些疯狂,Sora可能要着急了。 自OpenAI的Sora发布以来,AI视频生成技术便成为了科技界的热门话题。尽管Sora以其卓越的性能赢得了广泛关注,但其迟迟未能面向公众开放,让人…...
《UNIX环境高级编程》第三版(电子工业出版社出品)——两年磨一剑的匠心译作
历时两年,《UNIX环境高级编程》的翻译工作终于落下帷幕。这一路走来,真可谓是如鱼饮水,冷暖自知。还记得最初看到招募译者消息的那一刻,内心的激动难以言表。我毫不犹豫地报名,而后经历了试译、海选等激烈的角逐&#…...
【RK3588/算能/Nvidia智能盒子】AI“值守”,规范新能源汽车充电站停车、烟火及充电乱象
近年来,中国新能源汽车高速发展,产量连续8年位居全球第一。根据中国充电联盟数据,截至2023年6月,新能源汽车保有量1620万辆,全国充电基础设施累计数量为665.2万台,车桩比约2.5:1。 虽然新能源汽车与充电桩供…...
使用ReentrantLock和ThreadPoolExecutor模拟抢课
这里主要是在场景下帮助理解ReentrantLock和线程池的使用。 import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class GrabCourseTask implements Runnable {private final String studentName;private static int availableS…...
VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具
关于VirtFuzz VirtFuzz是一款功能强大的Linux内核模糊测试工具,该工具使用LibAFL构建,可以利用VirtIO向目标设备的内核子系统提供输入测试用例,广大研究人员可以使用该工具测试Linux内核的安全性。 工具要求 1、Rust; 2、修补的Q…...
统计学一(术语,正态)
目录 一,常用术语 二,正态分布(Normal Distribution) 三,中心极限定理(Central Limit Theorem) 一,常用术语 population(族群):要统计的总的 populationSize(族群数量):要统计的总…...
CleanMyMac X for Mac系统优化垃圾清理软件卸载 工具(小白轻松上手,简单易学)
Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、启动台显示软件图标,表示安装成功 三、运行测试1、打开软件,配置2、授权,允许完全磁盘访问 安装完成&a…...
从0开始开发一个简单web界面的学习笔记(HTML类)
文章目录 什么是HTML页面vscode 开放工具搭建第一个HTML页面编写vscode 如何快速生成代码框架html标签——注释、标题、段落、换行标签格式化标签img 标签(src 属性01)img 属性02(alt、title、width/height、border)a标签href属性a标签target属性表格标签01 基本属性表格标签02…...
【机器学习】对大规模的文本数据进行多标签的分类处理
1. 引言 1.1. NLP研究的背景 随着人工智能技术的飞速发展,智能助手、聊天机器人和虚拟客服的需求正呈现出爆炸性增长。这些技术不仅为人们提供了极大的生活便利,如日程管理、信息查询和情感陪伴,还在工作场景中显著提高了效率。聊天机器人凭…...
C++之std::type_identity
目录 1.简介 2.C20的std::type_identity 3.使用 type_identity 3.1.阻止参数推导 3.1.1.模板参数推导过程中的隐式类型转换 3.1.2.强制显式实例化 3.2.阻止推断指引 3.3.类型保持 3.4.满足一些稀奇古怪的语法 4.示例 5.总结 1.简介 std::type_identity 是 C17 引入的…...
头歌资源库(10)拼数字
一、 问题描述 二、算法思想 初始化一个长度为10的数组count,用于记录卡片中每个数字的数量。 从1开始依次尝试拼出正整数,直到无法拼出下一个数为止。 对于每个尝试拼出的正整数,遍历其每一位的数字,检查该数字在count中是否还…...
虚谷数据库-定时作业
虚谷数据库提供定时作业机制,用于定时、定期、自动的进行某些操作,可通过系统包 dbms_scheduler 进行定时作业创建、调度、查看、删除等。 DBMS_SCHEDULER 系统包封装了以下过程/函数:ENABLE、DISABLE、SET_JOB_ARGUMENT_VALUE、DROP_JOB、R…...
生信分析效率翻倍:fastp多线程+UMI处理技巧全解析(含实战案例)
生信分析效率翻倍:fastp多线程UMI处理技巧全解析(含实战案例) 在肿瘤基因检测和ctDNA测序领域,数据预处理环节往往成为整个分析流程的瓶颈。传统工具在处理海量测序数据时,不仅耗时长达数小时,还经常面临内…...
MCU开发 —— GD32篇:SEGGER Embedded Studio 外链编译器实战指南
1. 为什么选择SEGGER Embedded Studio开发GD32 SEGGER Embedded Studio(简称SES)作为一款轻量级跨平台IDE,这几年在嵌入式开发圈子里口碑相当不错。我自己从Keil转过来用SES开发GD32系列MCU已经两年多了,最直观的感受就是编译速度…...
Phi-3-Mini-128K实操手册:模型加载耗时优化技巧——分层加载与缓存机制应用
Phi-3-Mini-128K实操手册:模型加载耗时优化技巧——分层加载与缓存机制应用 1. 项目概述 Phi-3-Mini-128K是基于微软Phi-3-mini-128k-instruct模型开发的轻量化对话工具,专为本地部署和高效推理场景设计。该工具通过多项技术创新,显著提升了…...
BME280 I²C地址固化驱动:面向Adafruit模块的嵌入式优化实践
1. BME280传感器驱动库深度解析:面向Adafruit模块的IC地址固化设计与嵌入式工程实践1.1 项目定位与工程背景BME280是博世(Bosch Sensortec)推出的高精度环境传感器,集成温度、湿度和气压三参数测量功能,采用MEMS微机电…...
突破Android固件提取瓶颈:从格式迷宫到一站式解决方案
突破Android固件提取瓶颈:从格式迷宫到一站式解决方案 【免费下载链接】Firmware_extractor 项目地址: https://gitcode.com/gh_mirrors/fi/Firmware_extractor 【痛点场景:固件提取的"格式迷宫"困境】 深夜的开发者工作室里…...
MusePublic离线素材库:内置1000+优质Prompt模板一键调用
MusePublic离线素材库:内置1000优质Prompt模板一键调用 1. 项目简介:你的专属艺术人像创作引擎 想象一下,你是一位时尚摄影师或数字艺术家,脑海中有一个绝妙的画面:一位身着复古长裙的模特,在黄昏的巴黎街…...
新手友好:通过快马生成带详解的nodepad项目轻松入门Web开发
作为一个刚接触Web开发的新手,想要自己动手实现一个简易的文本编辑器(nodepad)可能会觉得无从下手。最近我在InsCode(快马)平台上尝试了这个项目,发现整个过程比我预想的要简单很多,特别适合像我这样的初学者来理解Web开发的基本流程。 项目结…...
【声纳与人工智能融合——从理论前沿到自主系统实战】第五章 声纳波形设计与主动感知智能优化
目录 第五章 声纳波形设计与主动感知智能优化 5.1 智能波形设计理论与方法 5.1.1 信息论指导下的波形优化 5.1.1.1 最大化互信息准则的波形设计 5.1.2 深度强化学习在波形设计中的应用 5.1.2.1 状态空间、动作空间与奖励函数设计 5.1.2.2 动态环境下波形序列的自适应生成…...
从OBS源码看WASAPI实战:Windows音频采集的‘静音循环’修复与高精度时间戳处理
从OBS源码剖析WASAPI音频采集:静音循环修复与高精度时间戳的工程实践 在直播软件OBS的音频处理模块中,WASAPI接口的高效运用直接决定了音画同步质量与系统资源占用率。本文将深入OBS源码,揭示其解决Windows音频采集两大核心难题的技术方案&am…...
STM32与ESP8266实现疫苗接种数据监控系统
STM32实现全球新冠疫苗接种数据监控系统设计指南1. 项目概述1.1 系统功能本项目基于STM32微控制器实现了一个全球新冠疫苗接种数据实时监控平台,通过WiFi模块连接互联网获取最新的疫苗接种统计数据,并在LCD显示屏上直观展示。系统主要功能包括࿱…...
