文章

C# Attribute 特性

应该如何理解C#中的特性(Attribute)?先用一句话总结一下,特性就是用来对C#中的类、字段、属性、方法、甚至是特性自身添加额外的信息和行为的一种方式。为什么说是添加“额外”的信息和行为呢?因为一个元素使用Attribute后实际上会在编译后的元素内部产生IL语言,并且在Metadata中会有记录。

一提到Metadata,我们就要立马想起C#的另一大特性,反射Reflection,我们最终对元素添加的Attribute会存储到Metadata中,即我们可以通过反射的方式来获取到这个元素所拥有的所有Attribute,是的,一个元素可以有多个Attribute来进行修饰和添加行为。需要注意的是,特性Attribute和反射Reflection是息息相关的,特性本身没有什么用处,但是结合反射就有用了,因为就如我们前面所说,特性Attribute最终是以IL语言存在与使用元素代码块内以及记录在Metadata中的,我们必须通过反射来使用和“激活”我们所写的或者某个框架自带的特性Attribute。

与我们的代码注释有点相似,只不过代码注释是给开发人员看的,而Attribute可以理解为是给编译器看的注释,即注释不能直接影响程序的运行,但是特性Attribute可以。

实际上,特性也是一个类,即不论是框架自带的特性还是我们自定义的特性,都需要继承自Attribute类,值得注意的是,我们可以在自定义的Attribute中进行任何对于一般类的操作,写属性写字段写方法等等,因为Attribute就是一个类,我们不要因为他的特殊性就设定很多的条条框框。Attribute与一般的类不同的点就在于,我们在代码阶段我们就要确定我们写的Attribute中所含所有信息,列如字段属性的类型、值、方法的参数、返回值等等,因为在编译后Attribute就不能再被动态的修改了,就像泛型那样。

总之特性可以在不破坏类型封装的前提下,添加额外的信息和行为。并且必须通过反射来使用我们所写的Attribute,否则Attribute不会发生任何作用。

本文由作者按照 CC BY 4.0 进行授权