知识点|C#高级知识:Attribute特性
C#特性[Attribute]是一类特殊的语法结构,我们掌握了特性的相关用法,就能在运行时,通过反射,得到一些额外的属性,给后续程序逻辑进行使用和判断。
我们在日常的代码中,通常都是通过反射来获得相关特性对象,再赋值给相关对象,进行获取判断。
我们接下来看看,我们日常工作中的特性的使用。
构建自定义特性类
我们该怎么构建自己的特性呢?
.NET FRAMEWORK 类库框架中所有特性类都是派生于Attribute这个基类。
所以我们自定义的特性类代码将类似于下面的内容:
[AttributeUsage(AttributeTargets.Class| AttributeTargets.Property)]
public class MyAttribute:Attribute
{
///相关属性 字段
public MyAttribute(){
//构造方法
}
}
这么写完,我们就能用这个特性了。
一些名词的解释:
-
[AttributeUsage()] 表示本特性类作用的范围。编译的时候直接调用该构造方法
-
参数:需要传递枚举Enum类型值,上面代码中表示本特性只能作用于类级别或者是属性级别
这里有个知识点:原来方法中传入enum类型的值可以用' | '来表示传入多个。
ok,我们构建了自己的特性类,我们该怎么用?
自定义特性上战场之:寄生
目前为止,我们已经构建了自己的特性:MyAttribute类,接下来我们让他像寄生虫一样寄生到别的类上面。
直接上一个Model类:
///本类是模型类,表示所有人,或者数据库里面有一张people这样的数据表
[My()]
public class people{
private string personname;
[My()]
public string Personname{
get{ return this.personname;}
set{this.personname=value;}
}
}
ok,成功让MyAttribute寄生到people类中。可能大家会对其中的代码存在一些疑问,我们一一进行讲解:
-
[My()]是什么? My是MyAttribute的缩写,比如YourAttribute在使用的时候,就可以缩写为:[Your()]
-
My()告诉编译器,这里是特性类,你需要实例化这个特性类,如果特性类构造方法有参数的,可以传参。
注意点:自定义特性类的时候,不能是静态的类型,也就是static不能用来修饰类名,否则编译的时候怎么实例化呢?
构建好了,寄生也完成了,那么我们怎么用啊? 下面就要寄出一个高端货了。
自定义特性上战场之:获取
目前为止,我们完成了两个步骤:构建特性类、寄生特性类。
完整的步骤就剩一下一步:获取特性类记录的数据。
完成了这个,革命就成功了。
代码驾到:
public static class DoAttr{
public static string CheckAttr(people p){
if(p!=null){
Type type=p.GetType();
PropertyInfo propertyMy=type.GetProperty("Personname");//反射获取该属性
//接下来获得我们的特性
var myattr=(MyAttribute)propertyMy.GetCustomAttribute(typeof(MyAttribute),false);
string personnme=myattr.Personname;
return personname;
}else{
return null;
}
}
}
ok了,我们通过该方法获取了people类的一些额外的数据信息,这个数据信息获得之后,随便我们怎么弄了,展示在网页上,存储到数据库都可以了。
这里有一个注意点:
当我们通过反射获取特性的时候,命名空间请写上,写全。
我们总结一下:特性是类级别的,也意思就是寄生了特性的类,所有实例化的对象都具备了相同的特性信息,所以,特性是类级别上的额外属性。
很多人问:学C#什么用?工作机会少得可怜。别的我就不说了,学C#你就可以结合Unity做AR啊!微软的全息眼镜,科技感十足啊。
VS2017出来啦,号称这个星球上最屌的IDE,据说体验很好,赶紧下起来。
如果想要源代码,请留言哦。