1.Attribute定义

公共语言运行时允许添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据(metadata)保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。我们简单的总结为:定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息。
 
 
 
2.Attribute的长记法和短记法
说明ConditionalAttribute和Conditional是一样 的
  1. // 长记法
  2. [ConditionalAttribute("LI")]
  3. [ConditionalAttribute("NoBug")]
  4. publicstaticvoidFun()
  5. {Console.WriteLine("Created By Li, NoBug.");}
  6. // 短记法
  7. [Conditional("LI")]
  8. [Conditional("NoBug")]
  9. publicstaticvoidFun()
  10. {Console.WriteLine("Created By Li, NoBug.");}
 
 3.预处理指令
#define  debug
虽然选择的是release模式,但是在代码中预定义是debug模式,所以还是代码还是会按照debug模式来执行的
 
4.常用指令
[Conditional("DEBUG)]     下面的代码在DEBUG模式下,才会被执行,注意里面的DEBUG必须大写,小写就变成预定义指令了
[obsolete ("这段不会执行"),true] 弃用下面的代码段,true代表代码如果执行了,就会抛出一个异常,现实“这段代码不会执行”
[AttributeUsage(AttributeTargets.Class,AllowMultiple=false,inherited = false)]
AttributeUsage确定可以如何使用自定义特性类。 AttributeUsage 是一个可应用于自定义特性定义,以便控制如何应用新特性的特性。 显式应用时默认设置如下所示,第一个属性规定自定义属性可以用在哪些地方,第二属性规定是否可以多用,第三个属性规定自定义属性是否可以继承
 
 
attribute 的实例化

就像牡蛎天生就要吸附在礁石或船底上一样,Attribute 的实例一构造出来就必需“粘”在一个什么目标上。

  Attribute 实例化的语法是相当怪异的,主要体现在以下三点:

  1.  不使用new 操作符来产生实例,而是使用在方括号里调用构造函数来产生实例。

  2.  方括号必需紧挨着放置在被附着目标的前面。

  3.  因为方括号里空间有限,不能像使用new 那样先构造对象,然后再给对象的属性(Property)赋值。

  因此,对Attribute 实例的属性赋值也在构造函数的圆括号里。

  并且,Attribute 实例化时尤其要注意的是:

  1.  构造函数的参数是一定要写。有几个就得写几个,因为你不写的话实例就无法构造出来。

  2.  构造函数参数的顺序不能错。调用任何函数都不能改变参数的顺序,除非它有相应的重载(Overload)。因为这个顺序是固定的,有些书里称其为“定位参数”(意即“个数和位置固定的参数”)。

  3. 对Attribute 实例的属性的赋值可有可无。反正它会有一个默认值,并且属性赋值的顺序不受限制。有些书里称属性赋值的参数为“具名参数”。

自定义Attribute 实例

 在此,我们不使用.NET  Framework 中的各种Attribute 系统特性,而是从头自定义一个全新的Attribute 类。

  示例代码如下:

  1. using System;
  2. namespace Con_Attribute
  3. {
  4. classProgram3
  5. {
  6. staticvoidMain(string[] args)
  7. {
  8. //使用反射读取Attribute
  9. System.Reflection.MemberInfo info =typeof(Student);//通过反射得到Student类的信息
  10. Hobby hobbyAttr =(Hobby)Attribute.GetCustomAttribute(info,typeof(Hobby));
  11. if(hobbyAttr !=null)
  12. {
  13. Console.WriteLine("类名:{0}", info.Name);
  14. Console.WriteLine("兴趣类型:{0}", hobbyAttr.Type);
  15. Console.WriteLine("兴趣指数:{0}", hobbyAttr.Level);
  16. }
  17. }
  18. }
  19. //注意:"Sports" 是给构造函数的赋值, Level = 5 是给属性的赋值。
  20. [Hobby("Sports",Level=5)]
  21. classStudent
  22. {
  23. [Hobby("Football")]
  24. publicstring profession;
  25. publicstringProfession
  26. {
  27. get {return profession;}
  28. set{ profession = value;}
  29. }
  30. }
  31. //建议取名:HobbyAttribute
  32. classHobby:Attribute// 必须以System.Attribute 类为基类,规范的写法一般是HobbyAttribute,用的时候可以简写为[Hobby(“”)]
  33. {
  34. // 参数值为null的string 危险,所以必需在构造函数中赋值
  35. publicHobby(string _type)// 定位参数
  36. {
  37. this.type = _type;
  38. }
  39. //兴趣类型
  40. privatestring type;
  41. publicstringType
  42. {
  43. get {return type;}
  44. set{ type = value;}
  45. }
  46. //兴趣指数
  47. privateint level;
  48. publicintLevel
  49. {
  50. get {return level;}
  51. set{ level = value;}
  52. }
  53. }
  54. }
5.通过反射来捕捉属性的值
首先自定义一个Person类
  1. classPerson:Attribute{
  2. privatestring _name;
  3. privateint _age;
  4. publicstringName{
  5. set{this._name = value;}
  6. get {returnthis._name;}
  7. }
  8. publicintAge{
  9. set{this._age = value;}
  10. get {returnthis._age;}
  11. }
  12. publicPerson(string s,int i){
  13. this.Name= s;
  14. this.Age= i;
  15. }
  16. }
再在使用一个类的时候加上这个属性
  1. [Person("spike",23)]
  2. class test {
  3. privateint aa;
  4. publicstring ss;
  5. }
再在Main函数中使用type类型的的GetCustomAttributes方法来返回属性的类,达到遍历属性类的目的
  1. Person per;
  2. foreach(var item intypeof(test).GetCustomAttributes(true)){
  3. per = item asPerson;//若item是自定义的Person类,则将Person类返回
  4. if(per !=null){
  5. Console.WriteLine(per.Name);
  6. Console.WriteLine(per.Age);
  7. }
  8. }
  9. Console.ReadKey();

C#中的Attribute定义及用法的更多相关文章

  1. C++中宏的定义与用法(现已被内联函数所代替)

    在noip中,宏还是被经常采用,所以这里讲一下,C++中宏的定义与用法 第一种用法——配合条件编译:#define DEBUG 定义一个叫DEBUG的标识符.它应该与#ifdef或#ifndef配合使 ...

  2. 关于C# 中的Attribute 特性

    关于C# 中的Attribute 特性 作者: 钢钢  来源: 博客园  发布时间: 2011-01-09 23:30  阅读: 13921 次  推荐: 12   原文链接 [收藏] 摘要:纠结地说 ...

  3. C#中的Attribute和Java中的Annotation

    在之前的博客中介绍过C#的Attribute(特性),简单的说,特性主要就是利用反射技术,在运行期获取关注类的相关标注信息,然后利用这些标注信息对关注的类进行处理,最近因为工作的原因,需要看一下Jav ...

  4. jquery中attr()与prop()函数用法实例详解(附用法区别)

    本文实例讲述了jQuery中attr()与prop()函数用法.分享给大家供大家参考,具体如下: 一.jQuery的attr()方法 jquery中用attr()方法来获取和设置元素属性,attr是a ...

  5. SpringMVC中 -- @RequestMapping的作用及用法

    一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.x ...

  6. C#中的Attribute详解(下)

    原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...

  7. Unity中使用Attribute

    Attribute是c#的语言特性 msdn说明如下: The Attribute class associates predefined system information or user-def ...

  8. Linq中关键字的作用及用法

    Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...

  9. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

随机推荐

  1. 轻快的VIM(五):复制

    操作相同文本的时候复制尤其有效,在Windows中我们都习惯了先用鼠标选择文本 而Vim下则不用那么麻烦,你甚至可以使用可视模式操作,但这里先略过 我在这一节主要说说命令模式下的复制 在讲复制之前我要 ...

  2. vim下很好的右键复制方法

    1)先按shift ,然后鼠标选中即可复制:(shift按下时为非vim环境) 2)好方法: "Enable and disable mouse use noremap <f1> ...

  3. js设计模式-命令模式

    命令模式是一种组织型模式,主要用在把调用对象(用户界面.API和代理等)与实现操作的对象隔离开.也就是说 ,凡是两个对象间的互动方式需要更高的模块化程度时都可以用到这种模式. 命令模式的好处:1.提高 ...

  4. selenium对浏览器属性操作的方法

    最大化 方法一 //指明ChromeDriver路径 System.setProperty(Src_url_string.Chrome_Driver, Src_url_string.Driver_ad ...

  5. Git Learning Part I - Install Git and configure it

    Why we need 'Git' GIt version control: 1. record the history about updating code and deleting code 2 ...

  6. 解决启动httpd报: apr_sockaddr_info_get() failed for错误

    我测试库里 service httpd start 时报 下面错误 httpd: apr_sockaddr_info_get() failed for fengxin.wzjzt.centoshttp ...

  7. UWP Ad

    1.对于 UWP 应用:使用 Visual Studio 2015 安装 Microsoft Store Services SDK 2.对于通用 Windows 平台 (UWP) 项目:展开通用 Wi ...

  8. 使用meta实现页面的定时刷新或跳转

    <meta http-equiv="refresh" content="5"> 这个表示当前页面每5秒钟刷一下,刷一下~ <meta http ...

  9. IOS Html富文本渲染方式:DTCoreText、WKWebView、UIWebView的内存占用对比

    在app的内容页(详情页)中,富文本的显示一直是经常需要处理的问题,而通常在后端的富文本编辑中,Html应用比较普遍,所以其实需要处理的Html富文本显示的问题,以下这三种方式肯定不是最优的显示Htm ...

  10. TCP连接的建立以及利用tcpdump分析连接建立的过程(转)

    原文地址:http://www.cnblogs.com/coser/archive/2010/12/05/1968812.html 一.实验目的 实验1_1: 使用Freebsd/Linux操作系统下 ...