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、特性本身没用,因为在类上加入特性后,只是单纯的声明,需要我们主动使用才有用。程序运行过程中,我们可以通过反射找到特性。 特性与反射息息相关,如果特性不使用反射,是不能发挥它的作用的。

 

 

过滤器是基于特性实现的。

 

 

 

posted @ 2020-11-03 10:58  揽月2020  阅读(58)  评论(0编辑  收藏  举报