Attribute Reflection 标签

    • 一句话的事儿:理解特性与反射之间地关系

    直接上一段源代码

    1. using System;
    2. using System.Reflection; //System.Reflection 类的 MemberInfo用于发现与类相关的特性(attribute)。
    3. namespace BugFixApplication
    4. {
    5. // 一个自定义特性 BugFix 被赋给类及其成员
    6. [AttributeUsage
    7. #region//定义了特性能被放在那些前面
    8. (AttributeTargets.Class |//规定了特性能被放在class的前面
    9. AttributeTargets.Constructor |//规定了特性能被放在构造函数的前面
    10. AttributeTargets.Field |//规定了特性能被放在域的前面
    11. AttributeTargets.Method |//规定了特性能被放在方法的前面
    12. AttributeTargets.Property,//规定了特性能被放在属性的前面
    13. #endregion
    14. AllowMultiple = true)]//这个属性标记了我们的定制特性能否被重复放置在同一个程序实体前多次。
    15. public class DeBugInfo : System.Attribute//继承了预定义特性后的自定义特性
    16. {
    17. private int bugNo;
    18. private string developer;
    19. private string lastReview;
    20. public string message;
    21. public DeBugInfo(int bg,string dev,string d)//构造函数,接收三个参数并赋给对应实例
    22. {
    23. this.bugNo = bg;
    24. this.developer = dev;
    25. this.lastReview = d;
    26. }
    27. #region//定义对应的调用,返回对应值value
    28. public int BugNo
    29. {
    30. get
    31. {
    32. return bugNo;
    33. }
    34. }
    35. public string Developer
    36. {
    37. get
    38. {
    39. return developer;
    40. }
    41. }
    42. public string LastReview
    43. {
    44. get
    45. {
    46. return lastReview;
    47. }
    48. }
    49. //前面有public string message;
    50. public string Message//定义了可以通过Message = "",来对message进行赋值。
    51. //因为不在构造函数中,所以是可选的
    52. {
    53. get
    54. {return message;}
    55. set
    56. {message = value;}
    57. }
    58. /*
    59. * 这部分可以简写如下
    60. * public string Message{get;set;}
    61. */
    62. }
    63. #endregion
    64. [DeBugInfo(45, "Zara Ali", "12/8/2012",
    65. Message = "Return type mismatch")]
    66. [DeBugInfo(49, "Nuha Ali", "10/10/2012",
    67. Message = "Unused variable")]//前面定义时的AllowMultiple=ture允许了多次使用在同一地方
    68. class Rectangle
    69. {
    70. protected double length;
    71. protected double width;//定义两个受保护的(封装)的成员变量
    72. public Rectangle(double l,double w)//构造函数,对两个成员变量进行初始化,公开的
    73. {
    74. length = l;
    75. width = w;
    76. }
    77. [DeBugInfo(55, "Zara Ali", "19/10/2012",
    78. Message = "Return type mismatch")]
    79. public double GetArea()
    80. {
    81. return length * width;
    82. }
    83. [DeBugInfo(56, "Zara Ali", "19/10/2012")]//因为message是可选项,所以可以不给出
    84. //不给出即为null,为空白
    85. public void Display()
    86. {
    87. Console.WriteLine("Length: {0}", length);
    88. Console.WriteLine("Width:{0}", width);
    89. Console.WriteLine("Area:{0}", GetArea());//常规打印
    90. }
    91. }
    92. class ExecuteRectangle
    93. {
    94. static void Main(string[] args)//程序入口
    95. {
    96. Rectangle r = new Rectangle(4.5, 7.5);//实例化
    97. r.Display();//执行打印长、宽、面积
    98. Type type = typeof(Rectangle);//让type对应这个Rectangle类
    99. // 遍历 Rectangle 类的特性
    100. foreach (Object attributes in type.GetCustomAttributes(false))//遍历Rectangle的所有特性
    101. {
    102. DeBugInfo dbi = (DeBugInfo)attributes;//强制转换
    103. if(null != dbi)//dbi非空
    104. {
    105. Console.WriteLine("Bug on: {0}", dbi.BugNo);
    106. Console.WriteLine("Developer: {0}", dbi.Developer);
    107. Console.WriteLine("Last REviewed: {0}", dbi.LastReview);
    108. Console.WriteLine("Remarks: {0}", dbi.Message);
    109. }
    110. }
    111. // 遍历方法特性
    112. foreach (MethodInfo m in type.GetMethods())//遍历Rectangle类下的所有方法
    113. {
    114. foreach (Attribute a in m.GetCustomAttributes(true))//遍历每个方法的特性
    115. {
    116. DeBugInfo dbi = a as DeBugInfo;//通过 object 声明对象,是用了装箱和取消装箱的概念.
    117. //也就是说 object 可以看成是所有类型的父类。
    118. //因此 object 声明的对象可以转换成任意类型的值。
    119. //通过拆装箱代替强制转换
    120. if (null !=dbi)//同理打印
    121. {
    122. Console.WriteLine("BugFixApplication no: {0},for Method: {1}", dbi.BugNo, m.Name);
    123. Console.WriteLine("Developer:{0}", dbi.Developer);
    124. Console.WriteLine("Last Reviewed: {0}", dbi.LastReview);
    125. Console.WriteLine("Remarks: {0}", dbi.Message);
    126. }
    127. }
    128. }
    129. Console.ReadKey();
    130. }
    131. }
    132. }

    • 本文作者:GeekPower - Felix Sun
    • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!