Heim  >  Artikel  >  Backend-Entwicklung  >  [C#-Tutorial] C#-Reflexion

[C#-Tutorial] C#-Reflexion

黄舟
黄舟Original
2016-12-24 13:26:201330Durchsuche

C# Reflection

Reflection-Objekt wird verwendet, um Typinformationen zur Laufzeit abzurufen. Diese Klasse befindet sich im System.Reflection-Namespace und bietet Zugriff auf die Metadaten eines laufenden Programms.

Der System.Reflection-Namespace enthält Klassen, mit denen Sie Informationen über Ihre Anwendung abrufen und Ihrer Anwendung dynamisch Typen, Werte und Objekte hinzufügen können.

Verwendungen von Reflection

Reflection hat die folgenden Verwendungszwecke:

Es ermöglicht die Anzeige von Attributinformationen zur Laufzeit.

Es ermöglicht die Inspektion verschiedener Typen in einer Sammlung sowie die Instanziierung dieser Typen.

Es ermöglicht die verzögerte Bindung von Methoden und Eigenschaften.

Es ermöglicht das Erstellen neuer Typen zur Laufzeit und die anschließende Verwendung dieser Typen zum Ausführen einiger Aufgaben.

Metadaten anzeigen

Wir haben im obigen Kapitel erwähnt, dass Sie Reflektion verwenden können, um Attributinformationen anzuzeigen.

Das MemberInfo-Objekt der System.Reflection-Klasse muss initialisiert werden, um Attribute zu erkennen, die sich auf die Klasse beziehen. Dazu können Sie ein Objekt der Zielklasse wie folgt definieren:

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

Das folgende Programm demonstriert dies:

using System;

[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute
{
   public readonly string Url;

   public string Topic  // Topic 是一个命名(named)参数
   {
      get
      {
         return topic;
      }
      set
      {

         topic = value;
      }
   }

   public HelpAttribute(string url)  // url 是一个定位(positional)参数
   {
      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();

      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, Es zeigt die benutzerdefinierten Eigenschaften an, die an die Klasse MyClass angehängt sind:

HelpAttribute

Instance

In diesem Beispiel verwenden wir die im vorherigen Kapitel erstellte DeBugInfo-Eigenschaft und verwenden Reflection, um die Metadaten zu lesen in der Rechteckklasse.

using System;
using System.Reflection;
namespace BugFixApplication
{
   // 一个自定义属性 BugFix 被赋给类及其成员
   [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
   {
      // 成员变量
      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);
         // 遍历 Rectangle 类的属性
         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);
            }
         }
         
         // 遍历方法属性
         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();
      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, werden die folgenden Ergebnisse erzeugt:

Length: 4.5
Width: 7.5
Area: 33.75
Bug No: 49
Developer: Nuha Ali
Last Reviewed: 10/10/2012
Remarks: Unused variable
Bug No: 45
Developer: Zara Ali
Last Reviewed: 12/8/2012
Remarks: Return type mismatch
Bug No: 55, for Method: GetArea
Developer: Zara Ali
Last Reviewed: 19/10/2012
Remarks: Return type mismatch
Bug No: 56, for Method: Display
Developer: Zara Ali
Last Reviewed: 19/10/2012
Remarks:

Das Obige ist der Inhalt von [c#-Tutorial] C#-Reflexion, mehr Für verwandte Inhalt, achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn