定义特性
特性是普通的类,可以有类的一切功能,但是特性需要继承Attribute类
class TipsAttribute : Attribute
{
public string tips;
}
可赋值成员
特性中暴露出来的成员可以在附加特性时,使用特殊语法进行赋值。
但仅限于常量。
也就是说,特性成员赋值,不能通过new,也不能通过其他运行时才能获取的东西进行赋值。
现场构造的特性
反射功能的其他内容,都是在整个程序里只生成一个。
但特性不是,每次获取特性都是实实在在的经历一次构造器。
所以,如果特性的构造器里,具有随机性赋值的成分,
那么多次获取统一特性,会具有不同的结果。
此外,一个特性类也是一个普通的类。可以直接通过new来构造。
TipsAttribute tp = new TipsAttribute();
tp.tips = "你好";
class TipsAttribute : Attribute
{
public string tips;
public DateTime Time;
}
尽管没有这方面的限制,特性类在声明时,还是应该仅包含一些常量内容。
特性的简易名字
一个特性类通常以Attribute结尾。但在附加特性时,可以省略结尾的Attribute。
(只有附加特性时。其他的例如继承,声明,获取时只能用完整的名字)。
[Tips]
class Tesk { }
class TipsAttribute : Attribute
{
public string tips;
}
而如果要强调(或是在省略后有重名类)特性的名字就是原本这样,不是省略的结果。
那么需要在前面加@
[@Tips]
class Tesk { }
class TipsAttribute : Attribute
{
public string tips;
}
class Tips : Attribute
{
public string tips;
}
限制特性
你可以指定你的特性类只能附加在特定的元数据上,比如只能在字段上,只能在方法上。
限制的方式为在特性类声明前使用系统特性。
是的,你写代码的整个过程编译器一直在使用反射。他可以检查到你代码上的特性,并对系统特性做出反应。
[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
class TipsAttribute : Attribute
{
public string tips;
}
构造方法参数只有一个枚举,指示了可以给哪些地方标记。
使用枚举的位运算来选择你想要的地方。
AllowMultiple属性的作用是是否允许多个相同的特性一起使用,默认是false。
Inherited属性指示,当有这个特性的类被继承时,特性是否会一起被继承。