知识点|C#高级知识:Attribute特性

C#特性[Attribute]是一类特殊的语法结构,我们掌握了特性的相关用法,就能在运行时,通过反射,得到一些额外的属性,给后续程序逻辑进行使用和判断。
我们在日常的代码中,通常都是通过反射来获得相关特性对象,再赋值给相关对象,进行获取判断。
我们接下来看看,我们日常工作中的特性的使用。

构建自定义特性类

我们该怎么构建自己的特性呢?

.NET FRAMEWORK 类库框架中所有特性类都是派生于Attribute这个基类。

所以我们自定义的特性类代码将类似于下面的内容:

[AttributeUsage(AttributeTargets.Class| AttributeTargets.Property)]  
public class MyAttribute:Attribute  
{
    ///相关属性 字段  
    public  MyAttribute(){
        //构造方法  
    }
}  

这么写完,我们就能用这个特性了。
一些名词的解释:

  1. [AttributeUsage()] 表示本特性类作用的范围。编译的时候直接调用该构造方法

  2. 参数:需要传递枚举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类中。可能大家会对其中的代码存在一些疑问,我们一一进行讲解:

  1. [My()]是什么? My是MyAttribute的缩写,比如YourAttribute在使用的时候,就可以缩写为:[Your()]

  2. 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,据说体验很好,赶紧下起来。
如果想要源代码,请留言哦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,267评论 25 708
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,283评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,677评论 19 139
  • 我的爱用完了 我挂了中医 她双手把脉 凝神定气曰 无病可医 我走出诊所 来到超市 抱起西瓜,十三块八 “我的爱用完...
    锄风少年阅读 185评论 0 0
  • 小时候最喜欢吃2毛钱的一股儿白糖水味儿的冰棍。不管有多少好吃的,反正2毛钱的冰棍我就很满足。冰棍一般有两种颜色,有...
    xiaoxiao不说话阅读 319评论 0 0

友情链接更多精彩内容