zoukankan      html  css  js  c++  java
  • 【原创】特性与反射(一)

    一:概念的理解

    .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工具快速查看一下元数据,就会发现问题特性的存在了.

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

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

  • 相关阅读:
    西交应用统计学(四)
    SPSS非参数检验
    并查集实现
    二叉树遍历非递归算法
    算法导论——渐近符号、递归及解法
    SPSS均值过程和T检验
    二维数组的查找及向函数传递二维数组问题
    printf()的格式
    C++ string类型的读写
    替换字符串中的空格
  • 原文地址:https://www.cnblogs.com/yxhblog/p/2544275.html
Copyright © 2011-2022 走看看