首页 > 编程语言 >C#特性(Attribute)

C#特性(Attribute)

时间:2024-09-07 14:54:09浏览次数:7  
标签:自定义 C# Attribute AttributeTargets 特性 DeBugInfo AttributeUsage

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

特性(Attribute)用于添加元数据,如编译器指令和注释,描述,方法,类等其他信息.  .Net框架提供了两种类型的特性:预定义特性和自定义特性.

规定特性(Attribute)

规定特性(Attribute)的语法如下:

[attribute(positional_parameters,name_parameter = value,...)]

element

特性(Attribute)的名称和值是在方括号内规定的,放置在它所应用的元素之前.positional_parameters规定必须的信息,name_parameter规定可选的信息.

预定义特性(Attribute)

.Net框架提供了三种预定义特性:

1.AttributeUsage

2.Conditional

3.Obsolete

AttributeUsage

预定义特性AttributeUsage描述了如何使用一个自定义特性类.它规定了特性可应用到的项目的类型.规定该特性的语法如下:

[AttributeUsage(
   validon,
   AllowMultiple=allowmultiple,
   Inherited=inherited
)]

其中:

1.参数validon规定特性可被放置的语言元素.它是枚举器AttributeTargets的值的组合.默认值是Attribute Targets.All.

2.参数allowmultiple(可选的)为该特性的AllowMultiple属性(property)提供一个布尔值.如果为true,则该特性是多用的.默认值是false(单用的).

3.参数inherited(可选的)为该特性的Inherited属性(property)提供一个布尔值.如果为true,则该特性可被派生类继承.默认值是false(不被继承).

例如:

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property, 
AllowMultiple = true)]

Conditional

这个预定义性标记了一个条件方法,其执行依赖于指定的预处理标识符.

它会引起方法调用的条件编译,取决于指定的值,比如Debug或Trace.例如,当调试代码时显示变量的值.规定该特性的语法如下:

[Conditional(
   conditionalSymbol
)]

实例代码如下:

Obsolete

这个预定义特性标记了不应被使用的程序实体.它可以让您通知编译器丢弃某个特定的目标元素.例如,当一个新方法用在一个类中,但是您仍然想要保持类中的旧方法,可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为obsolete(过时的).

规定该特性的语法如下:

[Obsolete(
   message
)]
[Obsolete(
   message,
   iserror
)]

其中:

1.参数message,是一个字符串,描述项目为什么过时以及该替代使用什么.

2.参数iserror,是一个布尔值.如果该值为true,编译器应把该项目的使用当作一个错误,默认值是false(编译器生成一个警告).

实例演示该特性:

 创建自定义特性(Attribute)

.Net 框架允许创建自定义特性,用于存储声明性的信息,且可在运行时被检索。该信息根据设计标准和应用程序需要,可与任何目标元素相关。

创建并使用自定义特性包含四个步骤:

  • 声明自定义特性
  • 构建自定义特性
  • 在目标程序元素上应用自定义特性
  • 通过反射访问特性

最后一个步骤包含编写一个简单的程序来读取元数据以便查找各种符号。元数据是用于描述其他数据的数据和信息。该程序应使用反射来在运行时访问特性。

声明自定义特性

一个新的自定义特性应派生自System.Attribute类.

在上面的代码中,我们已经声明了一个名为DeBugInfo的自定义特性

构建自定义特性

让我们构建一个名为DeBugInfo的自定义特性,该特性将存储调试程序获得的信息.它存储下面的信息:

1.bug的代码编号

2.辨别该bug的开发人员名字

3.最后一次审查该代码的日期

4.一个存储了开发人员标记的字符串消息

我们的 DeBugInfo 类将带有三个用于存储前三个信息的私有属性(property)和一个用于存储消息的公有属性(property)。所以 bug 编号、开发人员名字和审查日期将是 DeBugInfo 类的必需的定位( positional)参数,消息将是一个可选的命名(named)参数。

每个特性必须至少有一个构造函数。必需的定位( positional)参数应通过构造函数传递。下面的代码演示了 DeBugInfo 类:

应用自定义特性

通过把特性放置在紧接着它的目标之前,来应用该特性

标签:自定义,C#,Attribute,AttributeTargets,特性,DeBugInfo,AttributeUsage
From: https://blog.csdn.net/nazabanne/article/details/141808225

相关文章

  • AWTK fscript 中的 数学函数
    fscript是AWTK内置的脚本引擎,开发者可以在UIXML文件中直接嵌入fscript脚本,提高开发效率。本文介绍一下fscript中的**数学函数**1.d2r将角度转换成弧度,传入参数单位是角度。原型d2r(a)=>double示例print(d2r(7));2.r2d将弧度转换成角度,传入参数单位是弧度。原型r2d(a......
  • C#反射(Reflection)
    反射指程序可以访问,检测和修改它本身状态或行为的一种能力.程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集,模块和类型的对象.可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段......
  • AWTK fscript 中的位操作扩展函数
    fscript是AWTK内置的脚本引擎,开发者可以在UIXML文件中直接嵌入fscript脚本,提高开发效率。本文介绍一下fscript中的位操作扩展函数位操作扩展函数1.&位与运算。原型n1&n2示例print(1&1)2.|位或运算。原型n1|n2示例print(|(1,2))3.~按位取反运算。原型~(n1)示例p......
  • To enable inbound and outbound TCP traffic specifically for port 18917 using `uf
    ToenableinboundandoutboundTCPtrafficspecificallyforport18917usingufwonDebian12,followthesesteps:AllowinboundTCPtrafficonport18917:sudoufwallow18917/tcpAllowoutboundTCPtrafficonport18917(ifyouhaverestrictedoutgoingtra......
  • Adding /usr/local/lib to the dynamic (shared) link library path list on a Debian
    Toaddthepath/usr/local/libtothedynamic(shared)linklibrarypathlistonaDebian12x64system,youcandoiteithertemporarilyforthecurrentsessionorpermanentlyforallsessions.Herearethestepsforbothmethods:TemporaryMethod(forth......
  • Monetization of Copywriting
    Copywritingisthepracticeofwritingpersuasivecontentwiththegoalofconvincinganaudiencetotakeaparticularaction.Thiscaninvolvecraftingads,productdescriptions,websitecontent,emailcampaigns,socialmediaposts,andmore.Theprimary......
  • 0llama AI Chatbot
    llama$wgethttps://ollama.com/install.sh-Oollama_ai_install.sh--2024-09-0111:15:20-- https://ollama.com/install.shResolvingollama.com(ollama.com)...34.120.132.20Connectingtoollama.com(ollama.com)|34.120.132.20|:443...connected.HTTPrequest......
  • restful @RequestParam 可选,服务中的mock方法使用
    @RequestParam是一个SpringMVC注解,用于将请求参数绑定到你的方法参数上。当你标记一个参数为可选的时候,你可以不提供这个参数,在这种情况下,Spring将会使用这个参数的默认值,或者如果你没有设置默认值,它会使用参数的类型的默认值(例如,对于一个int类型的参数,默认值为0)。要将@......
  • cookie和session的区别
        什么是cookie?        cookie字面翻译就是饼干的意思;但是在web中可不是饼干的意思,通常一点理解就相当是登录视频网站啊,csdn网站的账户和密码,客户端发送账号密码还有GET请求的资源给服务端,服务端通过后台的数据库进行比对,发现密码账号对的上之后将......
  • INSERT ... ON DUPLICATE KEY UPDATE 问题记录
    起因:需要新增复制数据并更新原数据状态,故采用INSERT...ONDUPLICATEKEYUPDATE的方式来插入和更新数据问题:数据插入及更新异常环境:MySQL5.7.32数据表结构:点击查看代码CREATETABLE`example_table`(`col_a`varchar(255)NOTNULL,`col_b`varchar(255)NOTN......