c#入门-自定义特性

定义特性

特性是普通的类,可以有类的一切功能,但是特性需要继承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属性指示,当有这个特性的类被继承时,特性是否会一起被继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值