【原创】特性与反射(一)
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工具快速查看一下元数据,就会发现问题特性的存在了.
好了.本单内容就结束了.下一章会讲一下,如何获得元数据并在程序集中使用它.(反射)
转载的请注原创地址,谢谢。