Das beste C # Reflexion (Spiegelung)-Tutorial im Jahr 2024. In diesem Tutorial können Sie Reflex (Spiegelung) Anwendungen,Metadaten anzeigen,Beispiele, lernen
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.
Vorteile:
Nachteile:
Reflex (Spiegelung) für folgende Zwecke:
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
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: