C#- Attribute(特性)

文章目录

  • 前言
  • 一、C#- Attribute(特性)是什么?
  • 二、预定义特性
  • 二、自定义特性
  • 总结


前言

C# 的Attribute(特性)用法


一、C#- Attribute(特性)是什么?

特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。

特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。

.Net 框架提供了两种类型的特性:预定义特性和自定义特性。

二、预定义特性

预定义的特性可以用来为代码添加元数据和指示编译器和运行时执行特定的操作。同时可以增加代码的功能和可读性。

以下是一些常见的 .NET 预定义特性:

  1. [Serializable] 特性:用于标记一个类或结构体可序列化,并可以在网络上传输或保存到磁盘上。
[Serializable]
public class MyClass
{// ...
}
  1. [Obsolete] 特性:用于标记一个方法、属性或类已经过时,并提供相应的替代方案或建议。下面设置为true是启动报错。默认为false。
[Obsolete("This method is deprecated. Use NewMethod instead.", true)]
public void OldMethod()
{// ...
}
  1. [Conditional] 特性:用于指定一个方法只有在满足特定条件编译指令时才会被编译。例如:下方代码⬇️ #define DEBUG 与 [Conditional(“DEBUG”)] 配合使用。
// #define DEBUG
[Conditional("DEBUG")]
public void DebugMethod()
{// This method will only be included in the build if the DEBUG symbol is defined// ...
}
  1. [DllImport] 特性:用于指示在托管代码中引用一个非托管函数的定义。
[DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, string text, string caption, int options);
  1. [DataContract] 特性:用于指定一个类可以被序列化,并且可以控制序列化的方式。

  2. [DataMember] 特性:用于指定一个属性或字段可以被序列化。

  3. [WebMethod] 特性:用于标记一个方法可以被远程调用。

  4. [Route] 特性:用于指定路由规则,定义 ASP.NET MVC 中的路由。

  5. [HttpPost]、[HttpGet]、[HttpPut]、[HttpDelete] 特性:用于指定一个方法可以处理响应的 HTTP 请求类型。

  6. [Authorize] 特性:用于标记一个方法或控制器需要进行授权才能访问。

二、自定义特性

C#中的自定义特性允许我们在代码中添加元数据,以提供有关程序元素(类、方法、属性等)的额外信息。下面是详细的步骤来创建并使用自定义特性。

  1. 声明自定义特性:
    自定义特性需要继承System.Attribute类并添加AttributeUsage特性。AttributeUsage特性用于指定特性可以应用的目标(类、方法、属性等)以及特性的使用方式(一次性或多次性)。

    例如,我们可以创建一个自定义特性CustomAttribute,如下所示:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
    public class CustomAttribute : Attribute
    {// 添加自定义属性和方法public string Name { get; set; }public int Age { get; set; }// 构造函数public CustomAttribute(string name, int age){Name = name;Age = age;}
    }
    
  2. 构建自定义特性:
    在自定义特性中,我们可以添加一些属性和构造函数以提供需要的元数据。在上面的示例中,我们添加了NameAge属性,并定义了一个带有两个参数的构造函数。

  3. 在目标程序元素上应用自定义特性:
    为了在目标程序元素上应用自定义特性,我们可以使用方括号[]来将特性应用于类、方法、属性等。在方括号内,我们可以提供自定义特性的参数,就像在实例化类时提供构造函数参数一样。

    [Custom("John", 30)]
    public class MyClass
    {[Custom("Method 1", 25)][Custom("Method 2", 40)]public void MyMethod(){// 方法实现逻辑}
    }
    

    在上面的示例中,我们将Custom特性应用于MyClass类和MyMethod方法,并为每个特性提供相应的参数。

  4. 通过反射访问特性:
    我们可以使用反射来获取应用于程序元素的自定义特性,并访问特性的属性和方法。

    var type = typeof(MyClass);
    var classAttributes = type.GetCustomAttributes(typeof(CustomAttribute), true);
    foreach (var attribute in classAttributes)
    {var customAttribute = (CustomAttribute)attribute;Console.WriteLine($"Name: {customAttribute.Name}, Age: {customAttribute.Age}");
    }var method = type.GetMethod("MyMethod");
    var methodAttributes = method.GetCustomAttributes(typeof(CustomAttribute), true);
    foreach (var attribute in methodAttributes)
    {var customAttribute = (CustomAttribute)attribute;Console.WriteLine($"Name: {customAttribute.Name}, Age: {customAttribute.Age}");
    }
    

    在上面的示例中,我们首先通过typeof操作符获取MyClass的类型,然后使用GetCustomAttributes方法获取应用于类的特性。同样,我们通过反射获取MyMethod方法,并获取应用于该方法的特性。最后,我们可以访问特性的属性和方法。

    请注意,我们可以将typeofGetMethod方法的参数替换为其他目标程序元素(如属性或字段),以获取应用于该元素的特性。


总结

以上就是今天要讲的内容,本文简单介绍了的C# Attribute(特性)使用,预定义特性与自定义特性。

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

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

相关文章

51-12 多模态论文串讲—BLIP 论文精读

视觉语言预训练VLP模型最近在各种多模态下游任务上获得了巨大的成功,目前还有两个主要局限性: (1) 模型角度: 大多数方法要么采用encoder模型,要么采用encoder-decoder模型。然而,基于编码器的模型不太容易直接转换到文本生成任务&#xff0…

代码随想录 Leetcode242. 有效的字母异位词

题目&#xff1a; 代码&#xff08;首刷看解析 2024年1月14日&#xff09;&#xff1a; class Solution { public:bool isAnagram(string s, string t) {int hash[26] {0};for(int i 0; i < s.size(); i) {hash[s[i] - a];}for(int i 0; i < t.size(); i) {hash[t[i]…

【动态规划】dp多状态问题

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;按摩师&#x1f449;&…

Edge扩展插件安装位置

根据所获取的信息&#xff0c;Microsoft Edge的扩展插件安装位置和配置方式可以通过不同的方法管理。以下是一个大纲&#xff0c;概述了如何配置和管理Edge扩展插件&#xff1a; Edge扩展插件安装和管理大纲 了解扩展插件的安装模式 安装模式的选项&#xff1a;了解allowed、…

一元二次方程虚数解

对一元二次方程axbxc0 (a≠0)&#xff1b;若判别式△b-4ac<0,则方程无实根,虚数解为&#xff1a;x(-b i√(4ac-b))/(2a)。 只含有一个未知数&#xff08;一元&#xff09;&#xff0c;并且未知数项的最高次数是2&#xff08;二次&#xff09;的整式方程叫做一元二次方程[1] …

three.js学习笔记 day1-2

1.three.js是什么 开发Web 3D 应用的js封装类 2.three.js需要怎么上手 2.1引入 <script src"https://cdn.bootcdn.net/ajax/libs/three.js/r122/three.min.js"></script> 2.2三要数&#xff08;场景&#xff0c;照相机&#xff0c;渲染器&#xff0…

如何申请IP地址证书

什么是IP地址证书&#xff1f; IP地址证书是一种用于验证网站服务器身份的数字证书&#xff0c;它可以确保网站与用户之间的通信安全。与传统的域名证书不同&#xff0c;IP地址证书直接针对服务器的IP地址进行认证&#xff0c;适用于没有独立域名的网站或需要对多个域名进行统…

树莓派ubuntu22桌面配置(一)

烧录系统至树莓派 下载系统&#xff1a;https://ubuntu.com/download/raspberry-pi 选择合适的版本下载 镜像安装器安装&#xff1a;终端输入&#xff1a; sudo snap install rpi-imager 打开镜像安装器&#xff0c;按照需求选择树莓派版本与要写入的系统还有安装的u盘 方案…

Python 中的字符串匹配识别文本中的相似性

更多Python学习内容&#xff1a;ipengtao.com 字符串匹配是自然语言处理&#xff08;NLP&#xff09;和文本处理中的一个重要任务&#xff0c;它可以识别文本之间的相似性、找到相同或相似的模式&#xff0c;以及进行文本分类和信息检索等应用。本文将深入探讨Python中的字符串…

ssh 远程登录协议

一、SSH 服务 1.1 SSH 基础 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;SSH 为建立在应…

【Java-随笔】常见异常

org.apache.ibatis.exceptions.PersistenceException org.apache.ibatis.executor.ExecutorException Executor was closed.【说明】 SqlSession被关闭了&#xff0c;检查是否使用了被关闭的SqlSession&#xff1b;在sqlsession会话关闭后&#xff0c;再使用sqlsession就会出现…

坚持刷题|翻转二叉树

坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天先刷个简单的&#xff1a;翻转二叉树 题目 226.翻转二叉树 考察点 翻转二叉树又称为镜像二叉树&#xff0c;使用Java实现翻转二叉树通常是为了考察对二叉树的基本操作和递归的理解能力 递归的理解&#xff1a; 能够理解…

vue前端开发自学基础,动态切换组件的显示

vue前端开发自学基础,动态切换组件的显示&#xff01;这个是需要借助于&#xff0c;一个官方提供的标签&#xff0c;名字叫【Component】-[代码demo:<component :is"ComponetShow"></component>]。 下面看看代码详情。 <template><h3>动态…

独孤思维:程前其实不该道歉

最近沸沸扬扬的程前事件&#xff0c;说一个不同的视角观点。 程在三个old money面前&#xff0c;表现出肚里没货&#xff0c;不懂礼貌。 甚至还对三个老一辈进行人身攻击。 事件持续发酵&#xff0c;程顶不住压力&#xff0c;诚恳道歉&#xff0c;却被网络群嘲。 程彻底丧失…

opencv多张图片实现全景拼接

最近camera项目需要用到全景拼接&#xff0c;故此查阅大量资料&#xff0c;终于将此功能应用在实际项目上&#xff0c;下面总结一下此过程中遇到的一些问题及解决方式&#xff0c;同时也会将源码附在结尾处&#xff0c;供大家参考&#xff0c;本文采用的opencv版本为3.4.12。 首…

Qt/QML编程学习之心得:小键盘keyboard(36)

小键盘对于qml应用是经常用到的,在qml里面,就如一个fileDialog也要自己画一样,小键盘keyboard也是要自己画的,对于相应的每个按键的clicked都要一一实现的。 这里有一个示例: 代码如下: import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Window 2.0 im…

Jerry每次能向前或向后走n*n步(始终不能超过初始位置1e5),q(q <= 1e5)次询问,求向前走d最少要几次

题目 思路&#xff1a;因为有走的过程不能超初始位置1e5的限制&#xff0c;所以不能直接用奇数最多两次&#xff0c;4的倍数最多两次的结论。spfa&#xff0c;平方数的dis为1&#xff0c;然后推出其他数的dis #include<bits/stdc.h> using namespace std; #define int …

Python 与批处理:数据处理、系统管理和任务调度

批处理学习 大数据篇 &#xff5c; 大数据实操 三剑客之一的批处理 目录 批处理的概念使用场景框架选择选型如何选docker 安装 hivePython 操作 hivedocker 安装 sparkpyspark操作 dataframe如果使用 JAVA 原生的&#xff0c;而不用 spark会有什么区别 批处理的概念 批处理…

文件夹名称大小写转换的方法:提高文件管理效率的关键

在计算机的文件管理中&#xff0c;文件夹名称的大小写是经常被忽视的一个细节。这个看似微不足道的细节&#xff0c;却可能影响到文件管理效率和查找速度。下面一起来看云炫文件管理器如何批量修改文件夹名称大小写转换的方法&#xff0c;提高文件管理效率。 文件夹名称字母大…