Latest web development tutorials

C # Reflexion (Spiegelung)

Reflexionsmittel können das Programm, Zugriff auf seine Fähigkeit, einen eigenen Staat oder Verhalten zu erkennen und zu ändern.

Montage enthält das Modul, die Typen enthält, die Mitglieder wiederum enthält. Reflection bietet ein Objektpaket Baugruppen, Module und Typen.

Sie können Reflektion verwenden, um dynamisch eine Instanz des Typs zu erstellen, der Typ auf ein vorhandenes Objekt gebunden ist, oder die Art von einem bestehenden Objekt zu erhalten. Anschließend können Sie die Art der Annäherung an oder greifen Sie auf seine Felder und Eigenschaften.

Für und Wider

Vorteile:

  • 1, was auf eine verbesserte Prozessflexibilität und Skalierbarkeit.
  • 2, reduzieren Kopplung, erhöhen die Anpassungsfähigkeit.
  • 3, die das Programm zu erstellen und zu steuern, jede Art von Objekt, ohne vorherige hartcodierte Zielklasse ermöglicht.

Nachteile:

  • 1, Performance-Probleme: Die Verwendung ist im Wesentlichen ein Spiegelbild den Vorgang zu erklären, wenn die Felder und Methoden für den Zugriff auf viel langsamer als die direkte Code. So Reflexion über die wichtigsten Anwendungsflexibilität und Skalierbarkeit anspruchsvollen Rahmen, wird das allgemeine Verfahren nicht zu empfehlen.
  • 2, die Verwendung von Fuzzy-Reflexionen innerhalb der Programmlogik; Programmierer wollen die Logik in der Source-Code zu sehen, aber Reflexion umgehen den Quellcode-Technologie, die Wartungsprobleme bringen wird, und Reflexion Code komplexer als die entsprechenden Code direkt .

Reflex (Spiegelung) Anwendungen

Reflex (Spiegelung) für folgende Zwecke:

  • Es ermöglicht Ihnen, Eigenschaften zur Laufzeit (Attribut) Informationen anzuzeigen.
  • Es ermöglicht die Sammlung von verschiedenen Arten der Überprüfung sowie Beispiele dieser Typen.
  • Es ermöglicht die späte Bindung von Methoden und Eigenschaften (Eigentum).
  • Sie erlaubt die Schaffung eines neuen Typs zur Laufzeit, und dann die Verwendung dieser Art einige Aufgaben ausführen.

Metadaten anzeigen

Wir haben bereits im Abschnitt über die Verwendung von Reflexion (Spiegelung) erwähnt können die Eigenschaften (Attribute) Informationen anzuzeigen.

ObjektSystem.Reflection Membermuss Klasse initialisiert werden, um die Eigenschaften der Klasse (Attribut) assoziiert zu entdecken. Um dies zu tun, können Sie eine Zielobjektklasse definieren, wie folgt:

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

Das folgende Programm veranschaulicht diesen Punkt:

using System;

[Attributeusage (AttributeTargets.All)]
public class HelpAttribute: System.Attribute
{
   Öffentlichkeit nur lesbar String Url;

   public string Thema // Thema ist eine benannte (named) Parameter {
      erhalten
      {
         Rückkehr Thema;
      }
      Set
      {

         Thema = Wert;
      }
   }

   public HelpAttribute (string url) // URL ist eine Positionierung (Positions) Parameter {
      this.Url = url;
   }

   private string Thema;
}
[HelpAttribute ( "Informationen über die Klasse MyClass")]
Klasse MyClass
{
}

Namespace AttributeAppl
{
   Klasse-Programm
   {
      static void Main (string [] args)
      {
         System.Reflection.MemberInfo info = typeof (MyClass);
         Object [] Attribute = info.GetCustomAttributes (true);
         for (int i = 0; i <attributes.Length; i ++)
         {
            System.Console.WriteLine (Attribute [i]);
         }
         Console.ReadKey ();

      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird , wird es die benutzerdefinierten Eigenschaften einer KlasseMyClassangebracht Anzeige auf:

HelpAttribute

Beispiele

In diesem Beispiel werden wir erstelltdebuginfoEigenschaft im letzten Kapitel zu verwenden, und verwendet Reflexion (Spiegelung) , um die KlasseRectangleMetadaten zu lesen.

using System;
using System.Reflection;
Namespace BugFixApplication
{
   // BugFix eine benutzerdefinierte Eigenschaft wird der Klasse zugewiesen und ihre Mitglieder [Attributeusage (AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = true)]

   public class debuginfo: System.Attribute
   {
      private int Bugno;
      private string Entwickler;
      private string lastReview;
      public string Nachricht;

      public debuginfo (int bg, string dev, string d)
      {
         this.bugNo = bg;
         this.developer = dev;
         this.lastReview = d;
      }

      public int Bugno
      {
         erhalten
         {
            Rückkehr Bugno;
         }
      }
      public string Entwickler
      {
         erhalten
         {
            Rückkehr Entwickler;
         }
      }
      public string LastReview
      {
         erhalten
         {
            Rückkehr lastReview;
         }
      }
      public string Nachricht
      {
         erhalten
         {
            Rückmeldung;
         }
         Set
         {
            message = Wert;
         }
      }
   }
   [Debuginfo (45, "Zara Ali", "2012.12.08",
	Message = "Return type mismatch")]
   [Debuginfo (49, "Nuha Ali", "10.10.2012",
	Message = "Nicht verwendete Variable")]
   Klasse Rectangle
   {
      // Member Variablen doppelter Länge geschützt;
      doppelte Breite geschützt;
      public Rectangle (Doppel l, Doppel w)
      {
         Länge = l;
         width = w;
      }
      [Debuginfo (55, "Zara Ali", "19.10.2012",
	   Message = "Return type mismatch")]
      public double GetArea ()
      {
         Rückkehr Länge * Breite;
      }
      [Debuginfo (56, "Zara Ali", "19.10.2012")]
      public void Display ()
      {
         Console.WriteLine ( "Länge: {0}", Länge);
         Console.WriteLine ( "Breite: {0}", Breite);
         Console.WriteLine ( "Area: {0}", GetArea ());
      }
   } // Ende der Klasse Rectangle  
   
   Klasse ExecuteRectangle
   {
      static void Main (string [] args)
      {
         Rectangle r = new Rectangle (4,5, 7,5);
         r.Display ();
         Typ type = typeof (Rectangle);
         // Die Klasse Rectangle Traverse Attribute foreach (Objektattribute in type.GetCustomAttributes (false))
         {
            Debuginfo dbi = (debuginfo) Attribute;
            if (null! = dbi)
            {
               Console.WriteLine ( "Bug-Nr: {0}", dbi.BugNo);
               Console.WriteLine ( "Entwickler: {0}", dbi.Developer);
               Console.WriteLine ( "Last Bewertet: {0}",
					dbi.LastReview);
               Console.WriteLine ( "Bemerkungen: {0}", dbi.Message);
            }
         }
         
         // Iterate Methode Attribute foreach (Method m in type.GetMethods ())
         {
            foreach (Attribut ein in m.GetCustomAttributes (true))
            {
               Debuginfo dbi = (debuginfo) ein;
               if (null! = dbi)
               {
                  Console.WriteLine ( "Bug-Nr: {0}, für Methode: {1}",
						dbi.BugNo, m.Name);
                  Console.WriteLine ( "Entwickler: {0}", dbi.Developer);
                  Console.WriteLine ( "Last Bewertet: {0}",
						dbi.LastReview);
                  Console.WriteLine ( "Bemerkungen: {0}", dbi.Message);
               }
            }
         }
         Console.ReadLine ();
      }
   }
}

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

Länge: 4,5
Breite: 7.5
Gebiet: 33.75
Bug-Nr: 49
Entwickler: Nuha Ali
Zuletzt geprüft: 10.10.2012
Bemerkungen: Nicht verwendete Variable
Bug-Nr: 45
Entwickler: Zara Ali
Zuletzt geprüft: 2012.12.08
Bemerkungen: Rückgabetyp Mismatch
Bug-Nr: 55, für Methode: GetArea
Entwickler: Zara Ali
Zuletzt geprüft: 19.10.2012
Bemerkungen: Rückgabetyp Mismatch
Bug-Nr: 56, für Methode: Anzeige
Entwickler: Zara Ali
Zuletzt geprüft: 19.10.2012
Bemerkungen: