代码改变世界

【原创】特性与反射(一)

2012-06-10 21:21  杨新华  阅读(303)  评论(1编辑  收藏  举报

一:概念的理解

.Net应用程序包含了代码,数据,元数据.

元数据:是关于数据的信息,也就是类型,代码和程序集的信息,它们是和你的程序员一起被除数保存的.

特性:是添加元数据的一种机制,它是与你的数据,方法和类,甚至与程序自身有关的编译指令和其他数据.特性是被插入元数据的.

反射:程序读取它自身的元数据及其他程序的元数据的执行过程.

 

二:特性

(1)概念

特性是表示你希望与程序中某个元素相关联的数据的一个对象.挂接特性的元素被称为是特性的目标.

(2)CLR上的特性

如果你搜索CLR,将会发现大量的特性.某此特性应用在程序集上.另外一些应用在类或是接口上.还有一些如[WebMethod]这样的特性应用研究在类的成员上.这些类型被称为特性目标.在AttributeTargets枚举类中声明了所有的特性目标上 

例如:

ALL 应用在以下所有的元素上:程序集,类,构适函数,委托,事件,字段,接口 方法,模块,参数,属性,返回值或者结构体
Assembly 应用在程序集自身
Class   应用在类上
Delegate 应用在委托上
Enum   应用在枚举上

 

 

 

 

 

 

等等.有兴趣可以去查看相关的资料.

(3)应用特性

通过将特性放在紧贴目标项之前的中括号中,就可以将特性应用研究在目标上[程序集的情况除外,如果须要应用研究在程序集上,你必须将它们放在文件夹的顶部]

还可以组合应用多个特性,例如:

[assembly:自定义的特性]

[assembly:自定义的特性]

其它用途:与com互操作.例如[WebMethod][Serializable]特性等等.

(4)自定义特性

直接上代码:

 

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             MyMath mm = new MyMath();
 6             Console.WriteLine(mm.DoFun1(2));
 7 
 8 
 9         }
10     }
11     //创建自定义特性
12     [AttributeUsage(AttributeTargets.Class|AttributeTargets.Constructor|AttributeTargets.Field|AttributeTargets.Property|AttributeTargets.Struct,AllowMultiple=true)]
13     public class BugFixAttribute : System.Attribute
14     { 
15         public int BugId{get;private set;}
16         public string Date{get; private set;}
17         public string programer{get; private set;}
18 
19         public string commer { get; set; }
20         public BugFixAttribute(int bugId, string date, string progreammer)
21         {
22             this.BugId = bugId;
23             this.Date = date;
24             this.programer = progreammer;
25         }
26 
27     }
28     //使用自定义特性
29     [BugFixAttribute(1,"2010-1-1","这个是个重要的")]
30     [BugFixAttribute(2, "2010-3-1", "这个已经不能恢复了",commer="this is a Attribute")]
31     public class MyMath
32     {
33         public double DoFun(double parm)
34         {
35             return parm + DoFun1(parm);
36         }
37         public double DoFun1(double parm)
38         {
39             return parm / 3;
40         }
41     }

 

 程序运行时,好象没什么影响.是的,这样是看不到特性的信息的,我们可以使用ILDASM工具快速查看一下元数据,就会发现问题特性的存在了.

好了.本单内容就结束了.下一章会讲一下,如何获得元数据并在程序集中使用它.(反射) 

 

 转载的请注原创地址,谢谢。