C#特性(attribute)
什么是特性
特性(attribute)是一种让我们可以为代码标记一些信息,而这样的信息又可以被外部读取,并通过各种方式来影响我们所定义的类型的使用方式。这种手段通常被称为对代码进行“装饰(decorating)”
特性的语法如下:
[DebuggerStepThrough]
public void DullMethod(){...}
像这样在方法上面添加如[DebuggerStepThrough]这样的标记就是特性。可以为一段代码添加多个特性,这些特性用逗号隔开,或者用多个方括号括起来每一个均可。
读取特性
要读取特性的值,我们需要使用一种称为“反射(reflection)”的技术。反射的核心是System.Type这个类,反射的作用是在运行时动态检查类型信息,甚至是在创建对象的位置,或者在不必知道具体对象的情况下直接调用某个方法。使用Type.GetCustomAttributes()可以获取特性的信息,这个方法最多使用两个参数,返回一个包含一系列object实例的数组,每个实例都是一个特性实例。第一个参数是可选的,即传递我们感兴趣的类型或若干特性的类型(其他所有特性会被忽略)。如果不使用这一参数,将返回所有特性。第二个参数是必须的,即通过一个布尔值来指示,只想了解类本身的信息,还是除了该类之外还希望了解派生自该类的所有类。
代码示例如下:
Type classType=typeof(DecoratedClass);
object[] customAttributes=classType.GetCustomAttributes(true);
foreach(object customAttribute in customAttributes)
{
WriteLine($"Attribute of type {customAttribute} found");
}
通过这种方式了解到不同特性之后,我们就可以为不同的特性采取不同的操作了。
自定义特性
通过System.Attribute类进行派生,我们可以创建自定义的特性。
public class CunstomAttribue:Attribute
{
public CustomAttribute()
{
}
}
像这样的自定义特性可以应用到任意的目标类型,要想让我们自定义的特性只能用到我们指定的类型上,我们可以做出如下改进:
[AttribureUsage(Attribute.Class|AttributeTargets.Method,AllowMultiple=false)]
public class CunstomAttribue:Attribute
{
public CustomAttribute()
{
}
}
在这个改进中,我们通过使用AttribureUsage这个特性来指定自定义特性可以应用于什么类型以及是否可以对同一个目标进行多次应用。