特性
特性可以给成员添加元数据。这有两个作用:
- 这是一个元数据,可以利用反射获取到
- 如果编译器认识这个特性,那么可以与特性进行交互。
第一点涉及到反射的内容,先略过。
而第二点要求的编译器认实这个特性,就仅限于系统自带的特性。
添加特性
添加特性的操作是在一个可以加特性的东西上,用中括号,调用这个特性的构造器。
但这个构造器不需要在前面加new。如果是无参构造器则可以省略小括号。
[Obsolete]
class Tesk
{
}
多个特性
如果要给一个东西添加多个特性,可以用逗号隔开,也可是使用多个中括号。
也可以把这两种做法混合使用。
using System.Diagnostics;
class Tesk
{
[Conditional("DEBUG"), Conditional("TEST1")]
[Obsolete]
public void Show() { }
}
特性的成员的赋值
特性的大部分成员一般会通过构造器进行赋值。
但如果无法通过构造器赋值,那么会采用特殊语法进行赋值----因为特性的声明不在执行语句中,无法使用常规方法赋值。
在构造器的括号里,输入完整的成员名字,进行赋值。这个操作要写在构造器必需参数之后。
[Obsolete("", DiagnosticId = "")]
class Tesk
{
}
代码提示会告诉你,有哪些成员是可以进行赋值的。
系统特性
已过时
Obsolete特性为具有此特性的东西标记为过时
此特性有两个参数的构造方法,第一个参数填写额外消息,第二个参数指示警告等级是否要提高到错误
获取调用者信息
使用此特性时先引用System.Runtime.CompilerServices命名空间,否则没有自动补全
此空间下有4个特性,都需要配合可选参数使用。
CallerLineNumber特性,需要尾随一个int类型的可选参数,可以获得调用者的行号。
CallerFilePath特性,需要尾随一个string类型可选参数。可以获得调用者的程序文件位置。
CallerMemberName特性,需要尾随一个string类型可选参数,可以获得调用者的方法名称。
CallerArgumentExpression特性,需要尾随一个string类型可选参数,并在构造方法中写入一个此方法的参数名。
可以获得调用者的填入参数的字符串。
条件编译特性
这个特性需要引用System.Diagnostics命名空间,并配合预处理命令使用。
Conditional特性,需要一个string参数。如果预处理命令没有定义和参数同名的符号,则此方法不会执行。