20180426Advanced11Course3Attribute(特性attribute-语言进阶)【二】
一、在工作中见过的特性:
1、Obsolete:api升级时,有些方法用其它方法代替
[Obsolete("已过时,请使用XX来代替",true)]:使用在类、字段或方法上。
2、Serializable:可以序列化与反序列化
3、MVC中的filter:权限认证、异常处理
4、ORM中的table、key、display
5、DisplayName
6、DllImport:调用非托管dll
7、StringLength
8、Description
9、在MVC中,实体类的属性有Display
特性与注释的区别:特性与注释差不多,唯一的差别就是特性可以影响编译器/程序的运行。
二、特性:
1、它是一个类,直接/间接的继承自Attribute。一般以Attribute结尾,声明时可以省略掉Attribute。如StudentAttribute,在使用时用Student即可。
2、中括号声明,会给我们一种每个特性都可以带来对应的功能的错觉,实际上是,编译后会在元素内部产生IL,但是我们是没办法直接使用的(直接定义一个特性类使用它,没有任何作用),而且在metadata里面有记录。在IL中,如果在类上使用特性,它会变成类的一个构造。
使用: //可以直接指定属性、字段,方法不行。相当于实例化一个类
[Custom(123, Description = "1234", Remark = "2345")]
3、AttributeUsage
AttributeTargets:可以修饰哪些元素,默认为All
AllowMultiple:一个类可以多次修饰,默认为false。如,一个类上有两个相同名字的特性
Inherited:可不可以继承。默认为true
4、可以给类、属性、字段、参数、返回值加特性
5、特性本身没用,因为在类上加入特性后,只是单纯的声明,需要我们主动使用才有用。程序运行过程中,我们可以通过反射找到特性。 特性与反射息息相关,如果特性不使用反射,是不能发挥它的作用的。
过滤器是基于特性实现的。