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

news2024/10/7 8:19:45

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.coloradmin.cn/o/1836387.html

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

相关文章

WMS系统调拨盘点功能:优化仓储管理效率

一、调拨功能概述 WMS系统的调拨功能是指仓库内部或者不同仓库之间对商品进行转移的过程。调拨的目的在于平衡库存、优化存储空间和提高物流效率。调拨功能主要包括以下几个方面&#xff1a; 1. 调拨申请&#xff1a;根据业务需求&#xff0c;仓库管理员可以发起调拨申请&…

软件设计不是CRUD(23):在流式数据处理系统中进行业务抽象落地——详细编码

&#xff08;接上文《软件设计不是CRUD&#xff08;22&#xff09;&#xff1a;在流式数据处理系统中进行业务抽象落地——设计思考》&#xff09; 4、详细设计 项目开发初期&#xff0c;有两种测速雷达和对应的摄像头需要接入&#xff0c;分别是STC500型测速雷达和TTS400型测…

《UNIX环境高级编程》第三版(电子工业出版社出品)——两年磨一剑的匠心译作

历时两年&#xff0c;《UNIX环境高级编程》的翻译工作终于落下帷幕。这一路走来&#xff0c;真可谓是如鱼饮水&#xff0c;冷暖自知。还记得最初看到招募译者消息的那一刻&#xff0c;内心的激动难以言表。我毫不犹豫地报名&#xff0c;而后经历了试译、海选等激烈的角逐&#…

TestProject Python SDK入门

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;-CSDN博客跳槽涨薪的朋友们有福了&#xff0c;今天给大家推荐一个软件测试面试的刷题小程序。​编辑https://…

怎么提取视频中的音频?别错过这6个音频提取方法了!(全新)

您是否曾经发现过一个音乐很棒的视频&#xff0c;并想从视频中提取音频&#xff1f;如今&#xff0c;关于提取mp4视频中的音频需求越来越常见。例如&#xff0c;您可能想从mp4格式的电影中提取音频&#xff0c;将音乐用作手机铃声&#xff0c;或在自己的视频项目中使用视频中的…

C#唯一进程的处理Winform/WPF

C#唯一进程的处理 1.使用进程&#xff08;Process&#xff09;判断winformWPF执行效果&#xff1a; 2.使用互斥体&#xff08;Metux&#xff09;实现winformWPF实现效果&#xff1a; 在C#客户端&#xff08;Winform/WPF&#xff09;开发过程中&#xff0c;有的情况需要确保程序…

零基础入门学用Arduino 第四部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

Microsoft Visual C++ Redistributable 【安装包】【高速下载】

方法1、可以从官方下载&#xff0c;如下图 方法2 已经下载好并且已经整理好了2008--2022的所有版本点击下方链接即可高速下载 如果是win7-win8-win10-win11直接可以下载2015--2022版本&#xff0c;xp需要下载2015之前的 点击链接Microsoft Visual C Redistributable官方版本…

茶艺师服务师傅小程序APP源码(APP+小程序+公众号+H5)

&#x1f375;茶艺师服务小程序&#xff1a;品味生活的茶艺新体验&#x1f331; &#x1f33f;一、引言&#xff1a;茶艺师服务小程序&#xff0c;让生活更有味 在繁忙的生活中&#xff0c;品一杯香茗&#xff0c;感受茶文化的韵味&#xff0c;是许多人向往的休闲方式。然而&…

Android开发系列(四)Jetpack Compose之Button

在Jetpack Compose中&#xff0c;Button是一个常用的用户界面组件&#xff0c;用于执行某些操作或触发某些事件。Button控件是可触摸的&#xff0c;并且通常会显示一个文本或图标来表示其功能。 要在Jetpack Compose中创建一个Button&#xff0c;可以使用Button()函数&#xf…

C#——正则表达式详情

正则表达式 正则表达式: 列如判断一个字符串是不是手机号&#xff0c;或者密码是否包含大小写数字等这些要求&#xff0c;可以把这些条件写成一个表达式 创建正则表达式 string s1 "1234adsab1KHGFJD"; // 创建正则时需要在字符串前面加上 Regex r new Regex(&q…

序列化与反序列化漏洞实例

实验环境&#xff1a; 本次的序列化与反序列化漏洞为2021年强网杯上的一道比赛题目&#xff0c;我使用phpstudy集成环境将其测试环境搭建在了本地&#xff0c;如下。涉及的几个页面php为&#xff1a; index.php function.php myclass.php index.php : <?php // inde…

【Redis】java客户端(SpringData和jedis)

https://www.oz6.cn/articles/58 https://www.bilibili.com/video/BV1cr4y1671t/?p16 redis官网客户端介绍&#xff1a;https://redis.io/docs/latest/develop/connect/clients/ jedis maven引入依赖 <dependencies><!--引入Jedis依赖--><dependency><…

统计学一(术语,正态)

目录 一&#xff0c;常用术语 二&#xff0c;正态分布&#xff08;Normal Distribution&#xff09; 三&#xff0c;中心极限定理(Central Limit Theorem) 一&#xff0c;常用术语 population(族群)&#xff1a;要统计的总的 populationSize(族群数量)&#xff1a;要统计的总…

CSS【实战】抽屉动画

效果预览 技术要点 实现思路 元素固定布局&#xff08;fixed&#xff09;在窗口最右侧外部js 定时器改变元素的 right 属性&#xff0c;控制元素移入&#xff0c;移出 过渡动画 transition transition: 过渡的属性 过渡的持续时间 过渡时间函数 延迟时间此处改变的是 right …

【进阶篇-Day3:JAVA接口新特性、代码块、内部类、Lambda表达式、组件等的介绍】

目录 1、接口新特性1.1 JDK8的新特性1.2 JDK9的新特性 2、代码块2.1 代码块的定义2.2 代码块的分类 3、内部类3.1 内部类的定义3.2 内部类成员访问3.3 学习内部类的原因3.4 内部类的分类3.4.1 成员内部类3.4.2 静态内部类3.4.3 局部内部类3.4.4 匿名内部类&#xff08;1&#x…

使用自签名 TLS 将 Dremio 连接到 MinIO

Dremio 是一个开源的分布式分析引擎&#xff0c;为数据探索、转换和协作提供简单的自助服务界面。Dremio 的架构建立在 Apache Arrow&#xff08;一种高性能列式内存格式&#xff09;之上&#xff0c;并利用 Parquet 文件格式实现高效存储。有关 Dremio 的更多信息&#xff0c;…

【3D模型库】机械三维模型库整理

1 开拔网 简介&#xff1a;开拔网是中国较早的机械设计交流平台&#xff0c;广受行业内的各个大学&#xff0c;公司以及行业人士的欢迎。网站有非常丰富的3D模型&#xff0c;CAD图纸&#xff0c;以及各类热门软件的下载。同时我们也为行业搭建一个平台&#xff0c;提供各类设计…

分享:2024年(第12届)“泰迪杯”数据挖掘挑战赛省级奖项获奖名单公示

本次竞赛有评选省奖的省份有广东省、广西壮族自治区、河北省、湖北省。各省奖项依据“泰迪杯”全国评审专家组统一评阅的最终成绩区分省份后从高到低依序按比例产生。 广东省 省级奖项获奖名单公示 奖项设置&#xff1a; 一等奖&#xff1a;约占该省份队伍总数的5%&#xff0…

React 中的 ErrorBoundary

在 React 中&#xff0c;如果不做任何控制&#xff0c;当组件出现异常时&#xff0c;React 渲染就会停止&#xff0c;页面出现白屏&#xff0c;这种体验很不好。例如当用户输入某些非法数据&#xff0c;而前端都没有进行校验&#xff0c;页面出现白屏。这种情况下&#xff0c;最…