首页 > 作文

C#特性(Attribute)

更新时间:2023-04-06 02:17:25 阅读: 评论:0

一、什么是特性

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

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

特性的语法如下:

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

二、预定义特性

obsolete特性

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

语法如下:

其中:

参数message,是一个字符串,描述项目为什么过时的原因以及该替代使用什么。参数irror,是一个布尔值。如果该值为 true,编译器应把该项目的使用当作一个错误。默认值是 fal(编译器生成一个警告)。

请看下面的一个小例子:

上面的例子中,在student类上面使用了obsolete特性来标注该类已经过时了。编译代码结果:

三、自定义特性

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

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

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

1、声明自定义特性

在上面的例子中,使用f12查看obsolete的定义:

从上面的截图中可以看出,.net框架中的预定义特性是继承自attribute类,所以要自定义一个特性,只需要该类继承自attribut表现手法e即可,下面定义一个custom自定义特性:

注意:所有的特性默认以attribute结尾,骄傲的大公鸡但声明的时候可以不以attribute结尾。

2、构建自定义特性

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

3、在目标程序元素上应用自定义特性

通过把特性放置在紧接着它的目标(类、方法、属性、字段等)上面,来应用该特性:

注意:

1、如果在声明自定义特性的时候使用了attribute结尾,那么应用自定义特性的时候可以把attribute省略掉;如果声明的时候没有以attribute结尾,那么应用自定义特性的时候就不能把attribute省略掉。

2、默认情况下相同的特性只能应用一次,如果想应用多次特性,那么需要给特性添加attributeusage特性,customattribute特性修改如下:

其中,attributetargets是枚举值,f12转到定义可以查看attributetargets的所有枚举值:

attributetargets的枚举值表示custom特性可以应用在哪些目标上面。例如:attributetargets的枚举值是class,则表示customattribute只能应用在类上面。这里枚举值是all,表示可以在任何类型上面使用该特性。默认情况下枚举值是all。

allowmultiple表示该特性是否可以在类型上面多次使用:

这里allowmultiple的值为true,表示可以在类型上面多次使用该特性。如果为fal,则表示只能使用一次。默认情况下是fal。

inherited表示该特性是否可以由子类继承:

默认情况下inherited为true。

这是在看student类:

注意:如果一个类型上面多次使用了同一种特性,那么特性可以写在一起,中间用逗号隔开,例如上面的定义和下面的是同样的效果:

注意:在web api中frombaby和fromuri就是给方法的参数应用特性。

4、通过反射访问特性

定义一个manager类来管理特性:

main()方法里面调用:

结果:

四、应用特性

场景一:用户状态的枚举值,定义的是英文的字段,需要输出中文含义。枚举定义如下:

普通做法:根据枚举值进行判断,然后输出中文含义:

这种写法违反开不原则,不利于以后的扩展,下面使用特性实现。

先定义remark特性:

urstate枚举修改如下:

对e逆者num类型进行扩展:

main()方法里面调用:

结果:

场景二、做数据校验

student中有qq这个属性,范围是10000-999999999999,校验qq属性的值在这个范围区间内。

1、定义一个rangeattribute特性,用来验证属性范围

2、在student类的qq属性上面应用特性

3、对object类型进行扩展

4、在manager类里面使用validate扩展方法

5、在main()方法里面调用

结果:

如果这时候student里面增加了name属性,并且要验证name属性的长度,这时需要增加一个验证属性长度的特性:

在student类的name属性上面应用lengthattribute特性:

在objectextension里面增加长度的验证:

最后在main()方法里面调用:

结果:

仔细查看objectextension扩展类:每增加一个特性,扩展方法里面就要增加一段相同的代码(只是特性的类型不同),那么能不能做到增加特性,而这里不需要修改呢?请看下面的修改:

1、定义一个抽象类继承自attribute,里面有一个抽象的check()方法,定义如下:
2、修改rangeattribute和lengthattribute两个特性类,都继承自abstractvalidateattribute基类

rangeattribute类:

lengthattribute类:

3、修改objectextension扩展类
4、运行结果:

经过上面的修改以后,如果以后要新增一个特性,那么该特性只需要在本类中重写基类的check()方法即可,而不需要在修改objectextension扩展类。

到此这篇关于c#特性的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-06 02:17:23,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/73089c2680d44b74da44fa6b718fbc15.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C#特性(Attribute).doc

本文 PDF 下载地址:C#特性(Attribute).pdf

下一篇:返回列表
标签:特性   自定义   方法   定义
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图