c# attribute

2023-11-15

C#中的Attribute

 

目录

 

 

一.什么是Attribute

先看下面的三段代码:
  1. 自定义Attribute类:VersionAttribute
    1 [AttributeUsage(AttributeTargets.Class)]
    2 public class VersionAttribute : Attribute
    3 {
    4     public string Name { get; set; }
    5     public string Date { get; set; }
    6     public string Describtion { get; set; }
    7 }
  2. 使用自定义Attribute的Class:
    1 [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
    2 public class MyCode
    3 {
    4     //...
    5 }
  3. 上面这个Class中的Attribute一般会被如何使用呢?
     1 class Program
     2 {
     3     static void Main(string[] args)
     4     {
     5         var info = typeof(MyCode);
     6         var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));
     7         Console.WriteLine(classAttribute.Name);
     8         Console.WriteLine(classAttribute.Date);
     9         Console.WriteLine(classAttribute.Describtion);
    10     }
    11 }
    示例完毕!上面三段代码相信已经说明了Attribute大概是一个什么东西和怎么去用。
   

二.深入讨论Attribute

1.Attribute的概念定义

     关于Attribute概念的定义,我直接引用《你必须知道的.NET之特性和属性》中的一段来说明:

     MADN的定义为:公共语言运行时允许添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据(metadata)保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。

     我们简单的总结为:定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息。

噢,原来Attribute的目的是为元素提供关联附加信息。其中,上面第一段代码中“[AttributeUsage(AttributeTargets.Class)] ”说明了Attribute提供附加信息的元素是Class,所以如果上面第二段的代码改为:

public class MyCode
{
    [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  public void Test() { } }

 

会出现编译错误。

2.Attribute作为编译指令

     Attribute类是在编译的时候被实例化的,而不是像通常的类那样在运行时候才实例化。所以在第三段代码中,你可以在没有实例化MyCode对象的情况下取到MyCode的Attribute信息。由于Attribute类是在编译的时候被实例化的,所以你还可以用外部工具维护这些Attribute信息。

3.Attribute与Property

     从中文来说,Attribute和Property的中文都叫“属性”,很容易让人混淆。现在的文章,Attribute一般翻译为”特性”,而Property称为“属性”。

     或许你会问,我用静态的Property/Field一样可以做到在不实例化的时候拿到一些信息,如果这样的话,Attribute又有什么存在意义呢?

1.Property:

     Property可以说是一个面向对象的概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。比如:

    public class Robot
    {
        private string name = ""; //字段:Field public string Name //属性:Property,对Field进行封装。 { get { return name; } set { name = value; } } }

2.Attribute:

     Attribute的目标是:为元素提供附加信息。它的作用更类似于注释。

可以说,Property/Field和Attribute是两个完全不同的概念,虽然他们有些时候能做一样的事,但请记住,他们是从本质上就不同的两个东西。

三.实现自己的Attribute时需要注意的一些问题

1.自定义的Attribute必须直接或者间接继承System.Attribute。

2.这里有一个约定:所有自定义的特性名称都应该有个Attribute后缀。因为当你的Attribute施加到一个程序的元素上的时候,编译器先查找你的Attribute的定义,如果没有找到,那么它就会查找“Attribute名称"+Attribute的定义。如果都没有找到,那么编译器就报错。这就是为什么我可以再上面第一段代码中,定义一个VersionAttribute,但在第二段代码中,我使用却是Version这个Attribute。:>

下面是一些开发自定义Attribute时,可能需要用到的资料:

【1】Attribute可以关联的元素包括:

      程序集(assembly)、模块(module)、类型(type)、属性(property)、事件(event)、字段(field)、方法(method)、参数(param)、返回值(return)。例如:

1 [assembly: Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
2 public class MyCode
3 {
4     //......
5 }

用指定的前缀来表示特性所应用的目标元素,建议这样来处理,因为显式处理可以消除可能带来的二义性。

【2】AttributeTargets目标包括:

标记 说明
All 可以对任何应用程序元素应用属性。
Assembly 可以对程序集应用属性。 
Class 可以对类应用属性。
Constructor 可以对构造函数应用属性。
Delegate 可以对委托应用属性。
Enum 可以对枚举应用属性。
Event 可以对事件应用属性。
Field 可以对字段应用属性。
GenericParameter 可以对泛型参数应用属性。
Interface 可以对接口应用属性。
Method 可以对方法应用属性。
Module Module 指的是可移植的可执行文件(.dll 或 .exe),而非 Visual Basic 标准模块。
Parameter 可以对参数应用属性。
Property 可以对属性 (Property) 应用属性 (Attribute)。
ReturnValue 可以对返回值应用属性。
Struct 可以对结构应用属性,即值类型。

【3】AttributeUsageAttribute中的3个属性(Property)说明:

属性名 说明
ValidOn 该定位参数指定可在其上放置所指示的属性 (Attribute) 的程序元素。AttributeTargets 枚举数中列出了可在其上放置属性 (Attribute) 的所有可能元素的集合。可通过按位“或”运算组合多个 AttributeTargets 值,以获取所需的有效程序元素组合。
AllowMultiple 该命名参数指定能否为给定的程序元素多次指定所指示的属性。
Inherited 该命名参数指定所指示的属性能否由派生类和重写成员继承。


原文连接:https://www.cnblogs.com/hyddd/archive/2009/07/20/1526777.html

转载于:https://www.cnblogs.com/nafio/p/11592353.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c# attribute 的相关文章

  • EF Core 返回 null 关系,直到直接访问

    我有一些如下所示的模型 public class Mutant public long Id get set Relations public long OriginalCodeId get set public virtual Origi
  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • NHibernate:无状态会话错误消息无法获取代理

    我正在使用 nHibernate 无状态会话来获取对象 更新一个属性并将对象保存回数据库 我不断收到错误消息 无状态会话无法获取代理 我在其他地方有类似的代码 所以我不明白为什么这不起作用 有谁知道问题可能是什么 我正在尝试更新Screen

随机推荐

  • 7-19 支票面额 (15分)

    7 19 支票面额 15分 一个采购员去银行兑换一张y元f分的支票 结果出纳员错给了f元y分 采购员用去了n分之后才发觉有错 于是清点了余额尚有2y元2f分 问该支票面额是多少 输入格式 输入在一行中给出小于100的正整数n 输出格式 在一
  • 华硕天选一代无线网卡断网

    问题描述 本人笔记本是华硕天选1 型号为FA506IV 最近无线网卡经常断开 重连就显示无法连接网络 关闭WLAN再重开 发现一个网络都搜不到 打开任务管理器 查看性能一栏 WLAN这个选项没有了 打开设备管理器 查看网络适配器 Realt
  • 图的应用--Prim算法

    图的应用 Prim算法 Prim算法是一种基于顶点的贪心算法 从起始顶点出发 每次迭代选择当前可用的最小权值边 然后把边上依附的其他顶点加入最小生成树 prim算法可以称为 加点法 比较适合稠密图 算法思想 设G V E 是一个加权连通图
  • Python2.7网络通信socket和串口通信serial多线程同时实现

    Python2 7下多线程网络通信socket和串口通信serial同时进行 最近在写网络通信TCP IP读取数据和串口通信读取发送数据 之前写了单线程的然后这次尝试多线程实现 当然我是写的网络通信的服务端 话不多说贴上代码 coding
  • CentOS 7安装zabbix-agent 5.0报错:依赖检测失败:libpcre.so.0()(64bit)/获取GPG密钥失败解决

    报错信息 root localhost wget https mirrors tuna tsinghua edu cn zabbix zabbix 5 0 rhel 6 x86 64 zabbix agent 5 0 0 1 el6 x86
  • Conda、pip(安装torch等深度学习包、搭建运行环境)解决PackagesNotFoundError: The following packages....

    第一步 先创建一个环境 这个需要用conda来 conda create n 名字 python 版本号 这时可能会出问题 PackagesNotFoundError The following packages are not avail
  • C++:std::greater()、std::less()、自定义比较函数的规则

    文章目录 一 结论 1 排序和建堆的效果 2 解释结论 二 解析 1 比较规则 strict weak ordering 2 less和greater其实是什么 3 bool返回值和比较操作符 1 规则 2 并不是想当然的位置交换 3 lt
  • IDEA报错:Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found

    解决IDEA报错 Plugin org springframework boot spring boot maven plugin not found 刚开始学springboot 起初因为maven版本和IDEA不兼容 把maven降低了
  • 基于Ha-Joker靶场的完整渗透测试演示直至提权(root)

    信息收集 root kali arp scan l 通过ARP scan进行快速的主机发现 如下图我们猜测10 10 10 138可能是目标主机 root kali nmap sS sV p T4 10 10 10 138 之后通过nmap
  • python如何执行函数内的代码后再执行全局的代码

    在 Python 中 函数内的代码在调用函数时会被执行 如果要执行函数内的代码之后再执行全局的代码 可以在函数内部执行完代码之后使用 return 语句来返回控制权 例如 deffunc 在函数内部执行的代码 print Hello fro
  • 实现serializable序列化接口

    1 什么是序列化和反序列化 Serialization 序列化 是一种将对象以一连串的字节描述的过程 反序列化deserialization是一种将这些字节重建成一个对象的过程 2 什么情况下需要序列化 a 当你想把的内存中的对象保存到一个
  • c语言小项目 -------- 停车场管理系统

    添加摘要 1 设计目的 数据结构 课程主要介绍最常用的数据结构 阐明各种数据结构内在的逻辑关系 讨论其在计算机中的存储表示 以及在其上进行各种运算时的实现算法 并对算法的效率进行简单的分析和讨论 进行数据结构课程设计要达到以下目的 1 了解
  • 解决 command ’gcc‘ failed with exit status 1 错误问题

    在写Python代码的时候 需要用到psutil模块 需要安装 在安装psutil模块的时候出现的问题 重新安装了gcc等各种我能想到的 不过还是不行 网上说是其实安装一个对应的devel环境就可以了 报错如下 include
  • (深度学习)PyCharm 连接配置服务器

    需要 Pycharm 专业版 以 2022 版的 PyCharm 为例 1 连接服务器 File Settings Python Interpreter Add Interpreter On SSH 输入服务器的 Host Port 和 U
  • 为什么python适合写爬虫?

    1 抓取网页本身的接口 相比与其他静态编程语言 如java c C python抓取网页文档的接口更简洁 相比其他动态脚本语言 如perl shell python的urllib2包提供了较为完整的访问网页文档的API 当然ruby也是很好
  • 浅谈人工智能设备的硬件与软件

    人工智能时代的到来 使人们从很多繁重复杂的各种工作中得以释放 而背后的设备主要有硬件和软件来组成 硬件是构成人工智能设备的基础 软件则是充分挖掘硬件潜力的工具 硬件设计的标准化与规范化 以及其版本更改的高成本性 从而突出了软件易修改和深体验
  • 从0搭建夜莺v6基础监控告警系统(二):采集数据、打通夜莺显示

    文章目录 1 写在前面 1 1 categraf 采集数据 1 2 官方文档传送门 2 配置过程 2 1 打通夜莺和 VictoriaMetrics 2 2 配置 Categraf 2 3 验证结果 2 4 配置仪表盘 3 部署总结 3 1
  • C++ shared_ptr实现

    一 一些说明 1 智能指针用于资源管理 为了保证资源的操作得到顺利的执行防止资源泄露 因此大多数实现都以noexcept在参数列表后声明为不抛出异常 2 对于有些明确不需要更改调用对象内容的成员函数 用const在参数列表后修饰 常量成员函
  • Session(会话)

    1 2 1 原理 1 session是服务器端的技术 2 session是基于cookie技术的 1 2 2 session操作 1 默认情况下 会话不会自动开启 通过session start 开启会话 2 通过session id 获取
  • c# attribute

    C 中的Attribute 目录 什么是Attribute 深入讨论Attribute 实现自己的Attribute时需要注意的一些问题 一 什么是Attribute 先看下面的三段代码 自定义Attribute类 VersionAttri