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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,448评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,648评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,816评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,288评论 1 304
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,294评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,739评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,076评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,071评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,632评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,637评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,755评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,344评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,069评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,487评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,646评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,342评论 3 384
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,813评论 2 367

推荐阅读更多精彩内容

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