C# Reflexion

C# Reflexion
Wie der Name schon sagt, ist die Reflexion etwas, das ein Informationsbild über etwas gibt. In C#ist eine Reflexion ein bekannter Namespace, der in der "System" -Bibliothek gefunden wird, um Metadaten über die Klassen, Methoden, Parameter oder Typen zu sehen. Es enthält viele Klassen und Attribute, um verschiedene Informationen zu den Codeaspekten zu erhalten. Wir haben uns also entschlossen, einige sehr einfache Beispiele durchzuführen, um die Verwendung des Reflexionsnamenspace zusammen mit seinen Attributen zu erläutern. Beginnen wir mit der C# -Dateierstellung.

Beispiel # 01:

Erste Schritte mit dem ersten Beispiel, wir werden uns mit der Ausarbeitung der Verwendung des „Systems“ ansehen.Reflexion “Klasse, um Metadateninformationen zu verschiedenen Typen, Methoden oder Feldern zu finden. Also haben wir diesen Code mit der Verwendung der Systembibliothek gestartet, und danach haben wir das „System“ verwendet.Reflexionskurs im Code. Wir haben einen Namespace -Test und einen Klassentest darin gestartet.

Dieser Klassentest enthält eine einzelne Funktion, „main ()“, die unsere Treiberfunktion für diesen Code sein wird. Die Funktion main () wurde mit dem Schlüsselwort "Typ" gestartet, wodurch ein Typ "T1" einer Zeichenfolge über die Funktion "typeof ()" aus der Systemklasse geladen wird. Der "Typ" stammte aus der Reflexionsklasse. Jetzt wurde das gleiche Verfahren verwendet, um die Art von T2 und T3 einer Ganzzahl bzw. dem Charakter zu laden. Wie wir wissen, dass die Reflexionsklasse viele der Metadatenattribute entwickelt hat, um die Informationen zu Typen, Methoden und Feldern herauszufinden.

Wir werden diese Metadatenattribute hier verwenden, um Informationen zu den Typen T1, T2 und T3 zu finden. Somit haben wir drei Konsolen verwendet.WriteLine () Funktionsanweisungen zum Anzeigen des Namens, des Fullnamens, des Namespace und des Basetyps vom Typ T1, T2 und T3 separat. Dafür haben wir den "Namen", "Fullname", "Namespace" und "BaseType" -attribute einer Reflexionsklasse hier im Code verwendet.

Wir haben diese neu gemachte „Reflexion“ zusammengestellt.CS ”-Datei mit dem bereits in unserem Linux-System integrierten C# Compiler„ MCS “. Die "EXE" -Datei für diesen Code wurde generiert, und wir haben sie verwendet, um den kompilierten Code mit dem Befehl "mono" zu laufen zu lassen. Die auf unserem Bildschirm angezeigte Ausgabe zeigt uns den Namen, den Fullnamen-, Namespace- und Basetyp -Informationen für die geladene String, Ganzzahl und Zeichen geladener Typ.

Beispiel # 02:

In unserem ersten Beispiel haben wir Informationen zum Typ in C# -Metadaten anhand der Reflexionsklassenattribute erhalten. Wir werden die Reflexionsklasse verwenden, um Metadateninformationen über die geladene „Montage“ zu erhalten.„Also haben wir unser Beispiel mit der Verwendung der„ System “-Bibliothek in der ersten Zeile und mit dem„ System verwendet “gestartet.Reflexionskurs in der zweiten Zeile.

Dieser Code enthält einen Namespace -Test mit dem gleichen Namensklassentest. In diesem Klassentest haben wir die Main () -Treiberfunktion verwendet, um unser System auszuführen. Innerhalb der Funktion main () beginnt die Ausführung vom Laden einer Baugruppe „T."Diese geladene Baugruppe Variable" T "wird die Metadateninformationen zur" int "-Anbaugruppe von C# über die Funktion" Typeof "unter Verwendung" int "darin erhalten, gefolgt vom Schlüsselwort" Assembly ". Die nächste genaue Linie hat die Konsole.WriteLine () Funktion zum Anzeigen der Metadateninformationen zur Baugruppe „T.Die Klasse und der Namespace sind hier abgeschlossen und der Code wird für die Verwendung gespeichert.

Wir haben diesen neu erstellten C# -Code mit dem "MCS" -Kompiler zusammengestellt und ihn dann mit dem "Mono" -Rimer -Executor für C# in Ubuntu 20 ausgeführt.04. Es zeigte den Namen einer Bibliothek für die „T“ -Mandelung als „MSCORLIB“, ihre Version, Kultur und öffentliche Schlüsselmarke auf unserem Bildschirm darunter.

Beispiel # 03:

In unserem letzten Beispiel werden wir uns die Metadateninformationen für alle Klassen, Methoden, Attribute oder Parameter über die Reflexionsklasse ansehen. Wir haben diesen Code also mit dem gleichen Codemuster gestartet, wie wir in den beiden oben genannten Beispielen verwendet haben, ich.e., die Verwendung der Systembibliothek und des „Systems.Reflexionskurs. Es wurde ein Namespace „neu“ erstellt, der zwei Klassen enthält, ich.e., Info und Test.

Lassen Sie uns zuerst die "Info" -Klasse besprechen. Innerhalb dieser Klasse haben wir die Eigenschaften oder Variablen definiert, die wir in diesem Code verwenden müssen, ich.e., Alter des Int -Typs und Name des String -Typs. Die Attribute „GET“ und „Set“ werden verwendet, um den Wert für beide Werte zu erhalten und sie dem Alter und Namen des Variablen zuzuweisen. Hier sind zwei Konstruktorfunktionen in den Klasseninformationen. Der erste Konstruktor hat keine Parameter, während der andere ein parametrisierter Konstruktor ist, der Werte in neuen Variablen „A“ und „n."Der einfache Konstruktor initialisiert die Werte von variablen Alter und Namen auf 25 bzw." leer ".

Andererseits hat der andere Konstruktor den Altersvariablen zufällige Variablenwerte zugewiesen, i, i.e., leer. Die benutzerdefinierte Funktion „show ()“ wurde hier verwendet, um die Variablen-Alterswerte und die "Namenswerte" auf der Konsole von Ubuntu 20 anzuzeigen.04 Verwenden der Funktion writeLine () aus der Konsolenklasse der Systembibliothek. Die erste Klasse wurde hier abgeschlossen.

Lassen Sie uns die "Test" -Klasse diskutieren, in der wir die Attribionsattribute „Reflexion“ verwendet haben, um Metadateninformationen zum Code zu erhalten. Es enthält also eine Main () -Methode, die unser Vollstrecker für diesen Code ist. Wir haben ein Objekt für die Klassenbaugruppe „ASB“ geladen, um die derzeit ausführende Baugruppe mit der Funktion 'getExecutingAsembly' zu erhalten. Dieses Objekt "ASB" wurde verwendet, um die Funktion "Gettypes ()" aufzurufen, um die Ansammlungstypinformationen in dem Typ -Array „t“ zu speichern.”

Jetzt ist es an der Zeit, jeden Typ von der Baugruppe zu iterieren und Informationen zu den Metadaten zu erhalten. Innerhalb der ersten Schleife "foreach" haben wir also den im Code verwendeten Typ über das Typ "t" iteriert, I.e., Klassen. Der Name der verwendeten Gesamtklassen wird vom Attribut „Name“ der Reflexionsklasse angezeigt. Ein Array „MET“ des MethodInfo -Typs wurde initialisiert, um Gesamtmethoden in der bestimmten Klasse mit dem Iterator „I.Eine innere "foreach" -Schichtung wird verwendet, um den Namen jeder Methode in der bestimmten Klasse über das Namensattribut anzuzeigen.

Das Parameterinfo -Array „Par“ wird definiert, um die Parameterinformationen für alle Methoden in der bestimmten Klasse mit der Funktion „getParameters ()“ zu erhalten. Die letzte innere Schleife wird verwendet, um alle Parameter „P“ zu iterieren, die im Array „Par“ gefunden wurden. Unser Code ist jetzt vollständig und zur Kompilierung bereit.

Die Metadateninformationen zu "Info" und "Test" -Kurse werden separat angezeigt. Die Klassen haben Parameter -Int -Typ -Methoden; String -Typ -Methoden; und Objekttypmethoden

Abschluss:

Auf diese Weise kann eine Reflexions -Namespace -Klasse verwendet werden, um Metadateninformationen zu Methoden, Typen, Parametern, Baugruppen und Klassen zu erhalten. In unseren ersten beiden Beispielen haben wir die Verwendung von Namen, Fullname, Namespace und Basetype -Attribut der Reflexionsklasse erörtert, um Informationen zu den geladenen Typen und der Montage zu erhalten, i.e., int, char, Zeichenfolge. Im letzten Beispiel haben wir die Gettypen, GetMethods (), GetParameters und das Attribut des Namens und des Parametertyps der Reflexionsklasse verwendet, um Metadaten über den gesamten Code zu erhalten.