开发手册 欢迎您!
软件开发者资料库

C# - 反思

C#反思 - 从简单和简单的步骤学习C#,从基本到高级概念,包括概述,环境设置,程序结构,基本语法,数据类型,类型转换,变量,常量,运算符,决策,循环,方法,Nullables ,数组,字符串,结构,枚举,文件I / O,类,封装,接口,继承,命名空间,多态性,运算符重载,封装,反射,属性,属性,索引,代理,事件,集合,泛型,匿名方法,不安全代码,预处理器指令,多线程,正则表达式和异常处理。

Reflection 对象用于在运行时获取类型信息.允许访问正在运行的程序的元数据的类位于 System.Reflection 命名空间中.

System.Reflection 命名空间包含允许您获取有关应用程序的信息并动态向应用程序添加类型,值和对象的类.

反射的应用程序

Reflection具有以下应用程序 :

  • 它允许在运行时查看属性信息.

  • 它允许检查程序集中的各种类型并实例化这些类型.

  • 它允许后期绑定到方法和属性

  • 它允许在运行时创建新类型,然后使用这些类型执行某些任务.

查看元数据

我们在前一章已经提到使用反射可以查看属性信息.

系统的MemberInfo 对象需要初始化.Reflection 类以发现与类关联的属性.为此,您可以定义目标类的对象,为 :

  System.Reflection.MemberInfo info = typeof(MyClass);

以下程序演示了这个 :

using System;[AttributeUsage(AttributeTargets.All)]public class HelpAttribute : System.Attribute {   public readonly string Url;      public string Topic   // Topic is a named parameter {      get {         return topic;      }      set {         topic = value;      }   }   public HelpAttribute(string url)   // url is a positional parameter {      this.Url = url;   }   private string topic;}[HelpAttribute("Information on the class MyClass")]class MyClass {}namespace AttributeAppl {   class Program {      static void Main(string[] args) {         System.Reflection.MemberInfo info = typeof(MyClass);         object[] attributes = info.GetCustomAttributes(true);                  for (int i = 0; i < attributes.Length; i++) {            System.Console.WriteLine(attributes[i]);         }         Console.ReadKey();      }   }}

编译并运行时,它会显示附加到的自定义属性的名称class MyClass :

HelpAttribute

示例

在此示例中,我们使用上一章中创建的 DeBugInfo 属性,并使用反射来读取矩形 class.

using System;using System.Reflection;namespace BugFixApplication {   //a custom attribute BugFix to be assigned to a class and its members   [AttributeUsage(      AttributeTargets.Class |      AttributeTargets.Constructor |      AttributeTargets.Field |      AttributeTargets.Method |      AttributeTargets.Property,      AllowMultiple = true)]   public class DeBugInfo : System.Attribute {      private int bugNo;      private string developer;      private string lastReview;      public string message;            public DeBugInfo(int bg, string dev, string d) {         this.bugNo = bg;         this.developer = dev;         this.lastReview = d;      }      public int BugNo {         get {            return bugNo;         }      }      public string Developer {         get {            return developer;         }      }      public string LastReview {         get {            return lastReview;         }      }      public string Message {         get {            return message;         }         set {            message = value;         }      }   }   [DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")]   [DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")]      class Rectangle {      //member variables      protected double length;      protected double width;            public Rectangle(double l, double w) {         length = l;         width = w;      }      [DeBugInfo(55, "Zara Ali", "19/10/2012", Message = "Return type mismatch")]      public double GetArea() {         return length * width;      }      [DeBugInfo(56, "Zara Ali", "19/10/2012")]      public void Display() {         Console.WriteLine("Length: {0}", length);         Console.WriteLine("Width: {0}", width);         Console.WriteLine("Area: {0}", GetArea());      }   }//end class Rectangle      class ExecuteRectangle {      static void Main(string[] args) {         Rectangle r = new Rectangle(4.5, 7.5);         r.Display();         Type type = typeof(Rectangle);                  //iterating through the attribtues of the Rectangle class         foreach (Object attributes in type.GetCustomAttributes(false)) {            DeBugInfo dbi = (DeBugInfo)attributes;                        if (null != dbi) {               Console.WriteLine("Bug no: {0}", dbi.BugNo);               Console.WriteLine("Developer: {0}", dbi.Developer);               Console.WriteLine("Last Reviewed: {0}", dbi.LastReview);               Console.WriteLine("Remarks: {0}", dbi.Message);            }         }                  //iterating through the method attribtues         foreach (MethodInfo m in type.GetMethods()) {                        foreach (Attribute a in m.GetCustomAttributes(true)) {               DeBugInfo dbi = (DeBugInfo)a;                              if (null != dbi) {                  Console.WriteLine("Bug no: {0}, for Method: {1}", dbi.BugNo, m.Name);                  Console.WriteLine("Developer: {0}", dbi.Developer);                  Console.WriteLine("Last Reviewed: {0}", dbi.LastReview);                  Console.WriteLine("Remarks: {0}", dbi.Message);               }            }         }         Console.ReadLine();      }   }}

编译并执行上述代码时,会产生以下结果 :

Length: 4.5Width: 7.5Area: 33.75Bug No: 49Developer: Nuha AliLast Reviewed: 10/10/2012Remarks: Unused variableBug No: 45Developer: Zara AliLast Reviewed: 12/8/2012Remarks: Return type mismatchBug No: 55, for Method: GetAreaDeveloper: Zara AliLast Reviewed: 19/10/2012Remarks: Return type mismatchBug No: 56, for Method: DisplayDeveloper: Zara AliLast Reviewed: 19/10/2012Remarks: