C#特性Attribute

C# 特性(Attributes)是用于在运行时为程序元素(如类、方法、属性等)添加声明性信息的一种方式。这些信息可以在程序运行时通过反射(Reflection)访问。特性可以用来控制程序行为、添加元数据或者影响程序的运行时行为。

特性的基本要素

  1. 声明性信息:特性提供了一种方式在不改变代码逻辑的情况下向程序元素添加信息。
  2. 反射:通过反射机制可以在运行时查询和获取特性信息。
  3. 自定义特性:除了使用.NET提供的标准特性外,你还可以定义自己的特性。

示例代码

以下是一个定义和使用自定义特性的示例:

using System;// 定义一个简单的自定义特性
public class InfoAttribute : Attribute
{public string Description { get; set; }
}// 应用自定义特性到类上
[Info(Description = "This is a class for demonstration.")]
public class DemoClass
{// 应用自定义特性到方法上[Info(Description = "This method does nothing.")]public void DemoMethod(){}
}// 使用反射来读取特性信息
public class Program
{public static void Main(){// 获取类的特性信息InfoAttribute classAttribute = (InfoAttribute)Attribute.GetCustomAttribute(typeof(DemoClass), typeof(InfoAttribute));Console.WriteLine("Class Description: " + classAttribute.Description);// 获取方法的特性信息var method = typeof(DemoClass).GetMethod("DemoMethod");InfoAttribute methodAttribute = (InfoAttribute)Attribute.GetCustomAttribute(method, typeof(InfoAttribute));Console.WriteLine("Method Description: " + methodAttribute.Description);}
}

在这个例子中,InfoAttribute 是一个自定义特性类,它继承自 System.Attribute。它有一个名为 Description 的公共属性。DemoClass 和它的方法 DemoMethod 被这个特性标记,并包含描述信息。在 Main 方法中,使用反射来获取这些描述信息并打印出来。这展示了如何定义特性、将它们应用到程序元素上,并在运行时检索它们的信息。

C# 特性Attribute除了用于添加元数据和通过反射检索信息之外,它们还可用于以下目的:

  1. 控制程序行为

    • 编译器指令:特性可以用来给编译器提供指令,如 [Obsolete] 用于标记过时的代码元素。
    • 条件编译:特性可用于条件编译,例如 [Conditional("DEBUG")] 可以使方法仅在 DEBUG 模式下编译和执行。
  2. 数据验证

    • 在数据模型中,特性经常用于验证数据。例如,在实体框架(Entity Framework)或数据注释(Data Annotations)中,你可以使用 [Required], [StringLength] 等特性来定义数据验证规则。
  3. 序列化和反序列化控制

    • 在数据序列化过程中,特性用于控制如何将对象转换为 XML 或 JSON 等格式。例如,[Serializable][DataContract][DataMember]
  4. 拦截器和动态代理

    • 在面向切面编程(AOP)中,特性用于定义方法拦截器。这在动态代理创建时特别有用,例如在 .NET Core 中的依赖注入(DI)。
  5. 声明性安全

    • 特性可用于定义安全要求,如 [PrincipalPermission] 用于声明方法执行所需的安全上下文。
  6. 编写插件和扩展

    • 在插件架构中,特性可用于标识插件类或方法,便于动态加载和识别。
  7. 单元测试框架

    • 在单元测试中,特性用于标记测试方法和测试类(例如 [TestMethod][TestClass]),以及进行测试设置和清理(如 [TestInitialize][TestCleanup])。
  8. 依赖注入配置

    • 在依赖注入(DI)中,特性可以用于标记构造函数、属性或方法,以指导 DI 容器如何进行注入。
  9. 框架和库集成

    • 许多框架和库使用特性来集成与特定框架或库的功能,如 ASP.NET Core 中的路由、授权和过滤器特性(如 [Route], [Authorize], [ActionFilter] 等)。

通过这些用途,C# 特性成为了一种强大的机制,可以在不改变代码本身逻辑的情况下丰富和扩展代码的功能。

代码如下:

1. 编译器指令([Obsolete] 特性)

public class MyClass
{[Obsolete("Use NewMethod instead", false)]  // 标记为过时public void OldMethod(){Console.WriteLine("This is the old method.");}public void NewMethod(){Console.WriteLine("This is the new method.");}
}

2. 数据验证(使用数据注释)

using System.ComponentModel.DataAnnotations;public class User
{[Required]public string Name { get; set; }[StringLength(10, ErrorMessage = "ID cannot be longer than 10 characters.")]public string ID { get; set; }
}

3. 序列化和反序列化控制([Serializable][DataMember] 特性)

using System.Runtime.Serialization;[Serializable]
public class Person
{public string Name { get; set; }[DataMember]public int Age { get; set; }
}

4. 面向切面编程(AOP)中的方法拦截器

public class LoggingAttribute : Attribute
{// 这里只是示例,实际的拦截实现需要结合拦截器框架使用public void BeforeCall() => Console.WriteLine("Before method call");public void AfterCall() => Console.WriteLine("After method call");
}public class MyClass
{[Logging]public void MyMethod(){Console.WriteLine("Executing the method.");}
}

5. 声明性安全

using System.Security.Permissions;public class SecureClass
{[PrincipalPermission(SecurityAction.Demand, Role = "Administrator")]public void SecureMethod(){Console.WriteLine("This method requires the Administrator role.");}
}

6. 插件和扩展标识

public class PluginAttribute : Attribute
{public string Name { get; set; }
}[Plugin(Name = "MyPlugin")]
public class MyPlugin
{// 插件的实现
}

7. 单元测试

using Microsoft.VisualStudio.TestTools.UnitTesting;[TestClass]
public class MyTestClass
{[TestMethod]public void MyTestMethod(){// 测试代码}
}

8. 依赖注入配置

public class MyService
{[Inject]public IDependency MyDependency { get; set; }// 假设 Inject 是一个标记依赖注入的特性
}

9. 框架和库集成

using Microsoft.AspNetCore.Mvc;public class MyController : Controller
{[Route("api/myroute")]public IActionResult MyAction(){return Ok();}
}

以上代码示例涵盖了特性在 C# 中的各种不同用途,展示了特性如何被应用于实际编程场景中。

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

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

相关文章

郑州大学2020级信息安全专业——保研小结

最终上岸 夏令营: 夏令营开始的时间一般比较早,在期末考试之前就已经开始了,需要提前联系导师,有的学校是弱com,导师愿意要你入营的概率和优营的概率就会比较大,因此要提前联系导师,复习好项目…

51单片机应用从零开始(五)·加减乘除运算

51单片机应用从零开始(一)-CSDN博客 51单片机应用从零开始(二)-CSDN博客 51单片机应用从零开始(三)-CSDN博客 51单片机应用从零开始(四)-CSDN博客 详解 KEIL C51 软件的使用建立工程…

conan 入门指南

conan 新手入门 1 需要注意的事项2 使用 Poco 库的 MD5 哈希计算器2.1 创建源文件2.2 搜索poco conan 库2.3 获取poco/1.9.4的元数据2.4 创建conanfile.txt2.5 安装依赖2.6 创建编译文件2.7 构建和运行程序 3 安装依赖程序4 检查依赖关系5 搜索软件包6 与其他配置一起构建 该篇…

Python 爬虫 AES DES加密反爬

当你遇到需要处理 AES 或 DES 加密的反爬虫机制时,Python 可以通过使用相应的库来解决这类问题。首先,我们需要理解 AES 和 DES 加密是什么: AES (Advanced Encryption Standard):一种广泛使用的对称加密算法,它使用相…

Resolume Arena 7.15.0(VJ音视频软件)

Resolume Arena 7是一款专业的实时视觉效果软件,用于创造引人入胜的视频演出和灯光秀。它提供了丰富多样的功能和工具,可以将音频、视频和图像合成在一起,创造出令人惊叹的视觉效果。 Resolume Arena 7支持多种媒体格式,包括视频文…

LeetCode(25)验证回文串【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 验证回文串 1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&…

nvm工具的使用

一、出现的问题 今天安装了nvm工具后,意外发现node命令和npm命令失效了,命令行出现了以下现象 当输入node -v,显示:‘node’不是内部或外部命令,也不是可运行的程序或批处理文件。 最后发现,是因为在安装…

雷达中DBF算法的过程,以及重要概念波束形成向量和形成波束的理解

在数字波束形成(DBF)中,我们会计算输出信号在各个可能的到达角度上的功率谱。这个过程主要包括以下步骤: 设定角度范围:首先,我们需要设定一个可能的到达角度范围。这个范围通常是从-90度到90度,或者是从0度到360度,取决于我们的需求和天线阵列的配置。 计算波束形成向…

linux rsyslog日志采集格式设定四

linux rsyslog日志采集格式设定四 1.创建日志接收模板 打开/etc/rsyslog.conf文件,在GLOBAL DIRECTIVES模块下任意位置添加以下内容 命令: vim /etc/rsyslog.conf 测试:rsyslog.conf文件结尾添加以下内容 $template ztj,"%fromhost-ip% %app-name% %syslogseveri…

微机原理_10

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。) 1,将二进制数110110.01转换为十六进制为() A. 66.1H B. 36.4H C. 66.4 D. 36.2 2,一台计算机的字长是4个字节,含义是() A.能处理的最大…

【图像处理】:Otsu算法最大类间方差法(大津算法:附源码)

这里写自定义目录标题 数学原理算法评价参考链接 数学原理 以灰度图像为例,对于图像MN大小的矩阵,即图像中的像素,每一个值即为像素值,其中灰度图像像素值在(0~255)之间。 主要实现前景(即目标)和背景的分割: 主要公式…

在原生HTML页面发起axios请求

在原生html页面发起axios请求&#xff0c;首先需要先引入axios文件包&#xff0c;然后按照axios的请求方式发起请求即可&#xff0c;但如果页面在本地&#xff0c;那么请求一般会报错跨域问题&#xff0c;需要部署一下才能正确请求数据&#xff1b; 例子 <!DOCTYPE html&g…

C语言编程陷阱(三)

陷阱11:不要使用==运算符来比较两个字符串是否相等 字符串是C语言中常用的数据类型之一,它是由一系列字符组成的数组,以空字符\0结尾。有时候,我们需要比较两个字符串是否相等,比如在验证用户输入,或者在查找匹配的数据,或者在排序字符串等,就需要使用==运算符或strcmp…

<MySQL> 什么是数据库索引?数据库索引的底层结构是什么?

目录 一、什么是数据库索引? 1.1 索引的概念 1.2 索引的特点 1.3 索引的适用场景 1.4 索引的使用 1.4.1 创建索引 1.4.2 查看索引 1.4.3 删除索引 二、数据库索引的底层结构是什么&#xff1f; 2.1 数据库中的 B树 长啥样&#xff1f; 2.2 B树为什么适合做数据库索…

【漏洞复现】OneThink前台注入漏洞

漏洞描述 OneThink 是一个基于 PHP 的开源内容管理框架&#xff0c;旨在简化和加速Web应用程序的开发过程。它提供了一系列通用的模块和功能&#xff0c;使开发者能够更轻松地构建具有灵活性和可扩展性的内容管理系统&#xff08;CMS&#xff09;和其他Web应用。 免责声明 …

Meta降本增效大招之:弃用产品

今晚无意间进入去哪儿技术沙龙的直播间&#xff0c;听到他们要删除50%的代码和停掉50%的服务。我就想起Meta公司最近写的这篇博客&#xff1a;Automating product deprecation。 这篇博客对于效能平台的建设非常具有指导意义。文章最后有原文链接和我个人的总结。 这是一个系列…

扩散模型实战(九):使用CLIP模型引导和控制扩散模型

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…

SQL基础理论篇(三):数据表的创建原则

文章目录 简介数据表的常见约束设计数据表的原则参考文献 简介 DDL中常用的功能是增删改&#xff0c;分别对应的命令是create、drop和alter。 执行DDL的时候&#xff0c;不需要commit&#xff0c;就可以完成执行任务。 下面是MySQL里的一个典型的表创建语句&#xff1a; DR…

接口自动化测试面试题

前言 前面总结了一篇关于接口测试的常规面试题&#xff0c;现在接口自动化测试用的比较多&#xff0c;也是被很多公司看好。那么想做接口自动化测试需要具备哪些能力呢&#xff1f; 也就是面试的过程中&#xff0c;面试官会考哪些问题&#xff0c;知道你是不是真的做过接口自动…

京东数据挖掘(京东运营数据分析):2023年宠物行业数据分析报告

随着社会经济的发展&#xff0c;人均收入水平逐渐提高&#xff0c;使得宠物成为越来越多家庭的成员&#xff0c;宠物数量不断增长。伴随养宠人群的增多&#xff0c;宠物相关产业的发展也不断升温&#xff0c;宠物经济规模持续增长。 根据鲸参谋平台的数据显示&#xff0c;在宠物…