Reflection in C#?
Ich habe vor kurzem den übergang von einer Java-web-Entwickler, eine C# - Anwendung Entwickler tun meist WPF-Anwendungen. Ich Spring MVC mit Java, wo viele der code-Struktur wurde verdrängt und setup für mich. Da habe ich die Umstellung auf WPF, meine Anwendungen sind darauf angewiesen, dass meine Fähigkeit, setup-wiederverwendbar, entkoppelt code.
Habe ich versucht zu verbessern und meine Fähigkeiten mit bestimmten Bereichen von design, einschließlich Generika,Design-Patterns und-Reflexion.
Ich bin mir wohl bewusst, was diese sind und für die Generika-und Design-patterns, ich bin ziemlich gut in der Anwendung, was ich als best practices(obwohl dies in der Luft ist).
Was ich bin nicht allzu vertraut mit, ist Reflexion. Ich weiß, was Reflexion ist, und ich weiß, wie es zu tun, um Aufgaben, wie das dynamische laden der assembly,Methode und Klasse-Aufruf,etc.
Was ich nicht verstehe, ist, Beispiele, wie dies möglicherweise in der Lage, mir zu helfen.
Ich höre ständig, wie die Reflexion kann sehr hilfreich sein, wenn Sie wissen, wie es zu benutzen. Wenn ich versuche, die Forschung zu dem Thema, finde ich nur tutorials und Referenz, wie es zu tun, statt das gute, dass es verwendet werden kann für.
Meine Frage ist was kann ich als WPF-Entwickler mit Reflexion für die, die mir helfen werden, und/oder gibt es einen Ort, oder eine Referenz, die mir mehr als nur die syntax der Verwendung von Reflexion, aber auch Beispiele aus der Praxis und/oder best practices?
- lassen Sie mich wissen, wenn Sie irgendwelche anderen info ,ich implemeted Reflexion mehrfach in Projekte , vor allem seine nützlichen, wenn Sie nicht wissen, wie viele proertys' ein Objekt hat
- Wenn Sie Fragen, diese Frage, es wird wahrscheinlich nicht helfen, Sie. Die beste Praxis ist es, "verwenden Sie Nur die Reflexion, wenn Sie nicht denken, ein anderer Weg"
- Die meisten Möglichkeiten, mit der spiegelung sind jetzt übertroffen durch die
dynamic
Schlüsselwort. Dennoch, es ist wirklich nützlich für den Zugriff auf nette private .NET-Methoden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Reflexion ist ein bisschen wie anonyme Methoden: Es ist wirklich schwer zu sehen, wo es nützlich ist, bis Sie den ersten Anwendungsfall; nach, dass es in der Regel einfacher, um herauszufinden.
Hier ein Aktuelles Beispiel aus dem code, den ich schrieb, etwa ein Jahr und einen halben Tag. Für ein studentisches Projekt an meiner Uni, wir schreiben einen bot in C#, für die Zwecke der Wiedergabe von Texas Hold 'em. Wir schrieben auch eine event-basierte engine, die behandelt das Spiel selbst, inklusive Netzwerk-Unterstützung ermöglicht sowohl Mensch und Computer zu verbinden in einer Reihe von verschiedenen Maschinen. Um uns zu erlauben, zu sehen, was Los war, schrieben wir eine separate GUI-Anwendung, die verwendet wurde, um zu starten, verbinden, und an den spielen teilnehmen. Alle Spieler bekommen würde, hat durch diese Anwendung, bots und Menschen gleichermaßen.
Implementierten wir unser bot zu handeln basiert auf einem Modell, aber wie wir Fortschritte durch das Projekt haben wir änderungen vorgenommen, um das Modell, im wesentlichen die Erstellung verschiedener Versionen des bot. In unserem system hatten wir eine Klasse pro version von unserem Modell.
Sobald Sie haben verschiedene Versionen, es ist schön, in der Lage sein, Sie miteinander zu vergleichen, gegeneinander, um zu sehen, ob Ihre änderungen haben keine Wirkung. Zu tun, dass wir tagged jeder von unseren computer-Spieler-Klassen mit einem benutzerdefinierten Attribut, die wir als
CPUAttribute
.Das ist, wo die Reflexion ins Spiel kam: auf Start, unsere GUI verwenden würde, Reflexion Blick auf das entsprechende assembly und finden Sie alle die Typen, die wir hatten, markiert. Diese Arten würden dann Hinzugefügt, um eine dropdown-box, und die Reflexion verwendet wurde, zu instanziieren des ausgewählten Typs bei der Erstellung der Spieler.
Reflexion ist ein leistungsfähiges API. Auf seiner grundlegenden Ebene, die Reflexion ermöglicht Ihnen:
Wenn Sie den Mechanismus für die Bindung in WPF binden normal business objects, dann sind Sie bereits mit der spiegelung. Die Bindung API, nach der Suche für mehr formelle bindungsmechanismen (Erben von
DependencyObject
eine benutzerdefinierte type-descriptor, etc.), verwende reflektion zu erhalten und setzen der Werte von Eigenschaften auf Ihre business-Objekt (oder ViewModel).Zum Beispiel, sagen, Sie haben diese Klasse
public class Kunde
{
public string Name { get; set; }
}
Und Ihre WPF-Steuerelement (view) bindet an eine Sammlung dieser
Customer
Objekte, und hat ein label-Steuerelement, bindet an dieName
Eigenschaft. All dies ist in XAML definiert wird, sondern zur Laufzeit der code würde wie folgt Aussehen:Diese würde erhalten Sie den Wert aus der gebundenen Objekt-ohne zu wissen, etwas über seinen Typ-und damit das Steuerelement in der entsprechenden Mode. Ebenso:
Würde den Wert der Eigenschaft auf das Objekt zu
"Bob"
wieder, ohne etwas über seinen Typ.Als für wie es helfen kann Sie direkt, Anwendungsfälle HIERFÜR sind vergleichsweise selten. Wenn Sie finden, sich selbst in eine position zu müssen zur reflektion verwenden, um das zu vollbringen, was Sie brauchen, möchten Sie vielleicht zu prüfen, refactoring des Codes; es ist immer besser (in einer statisch typisierten Sprache wie C#) gehen mit code, der folgt, versus statische Typisierung mit dynamischer Aufruf per reflection. Während Metadaten-Inspektion ist ziemlich Billig, es braucht viel mehr Rechenleistung zu berufen, ein Mitglied von Reflexion, als es durch gewöhnliche Mittel.
Die kurze Antwort ist, ehrlich gesagt, wenn Sie Fragen, wie es Ihnen helfen kann, ist es am besten zu der Annahme, dass--für jetzt--das kann es nicht.
Reflexion kann verwendet werden für Dinge wie:
Beispiel:
Und dann etwas anderes suchen können für diese Attribute, wie ein validator:
Reflexion kann verwendet werden, für die Beobachtung und/oder ändern von Programm-Ausführung zur Laufzeit. Eine spiegelung-orientierte Programm-Komponente überwachen können, die Durchführung eines Gehäuses des Codes und ändern können, sich entsprechend zu einem gewünschten Ziel Bezug auf das Gehäuse. Dies erfolgt in der Regel durch die dynamische Zuweisung von Programm-code zur Laufzeit.
Beispiel:
Reflexion kann auch verwendet werden, um zu passen ein bestimmtes Programm zu unterschiedlichen Situationen dynamisch. Betrachten Sie beispielsweise eine Anwendung, die verwendet zwei verschiedene Klassen X und Y austauschbar, um ähnliche Operationen ausführen. Ohne reflection-oriented programming, die Anwendung möglicherweise hartcodierte Methode call-Namen der Klasse X und der Klasse Y. die Verwendung der reflection-oriented programming paradigm, könnte die Anwendung so konzipiert und geschrieben, um nutzen Reflexion, um zum aufrufen von Methoden in Klassen X und Y ohne hard-coding-Methode Namen. Reflection-oriented programming fast immer erfordert zusätzliche Kenntnisse, Rahmen -, relationale-mapping, Objekt-Relevanz, um die Vorteile von mehr generischen code-Ausführung. Hard-Kodierung können vermieden werden, soweit reflection-oriented programming verwendet wird.
Quelle: Wikipedia
Als auf der Suche MSDN docs.. Sie verfügen über umfangreiche Informationen und ein Beispiel zu diesem Thema.
Denken Sie jedoch daran, dass nach der Verschleierung manchmal spiegelung funktioniert nicht.
Reflexion ist nützlich für Bibliothek code, nicht bloß wissen über die tatsächlichen Arten. Ein gutes Beispiel ist die WPF, die Sie erwähnen; wie hältst du es gelöst strings in xaml Eigenschaften? Und die data-binding-strigs innen xaml?
Klassische Beispiele:
WPF verwenden Sie mindestens 3 von diesen; wahrscheinlich 4 wenn Sie mit einer Datenbank
Generell sollten Sie vermeiden, zu viel Reflexion im Anwendung - code; Arbeit an Schnittstellen für Ihre Domäne Entitäten bevorzugt.
Ich kann Ihnen ein Beispiel hier. Angenommen, Sie haben eine form mit all den Mitarbeiter-details. Angenommen, Sie haben ein Mitarbeiter-Klasse-Objekt mit allen Eigenschaften gefüllt.
In diesem Fall, wenn Sie verwenden Sie reflektion, es gibt keine Notwendigkeit, den Zugang jeder und jedes Textfeld und setzen Sie den Wert in das Textfeld schreiben Sie eine häufige Methode, die einen generischen Mitarbeiter-Objekt und füllen Sie das komplette Formular aus.
Dies ist, wo ich eingesetzt Reflexion.
Ich auch verwendet, Reflexion einmal zu Klonen, ein Objekt, ich weiß nicht, wie viele Eigenschaften einer bestimmten Klasse file hat , seine bestimmt zur Laufzeit , so dass ich verwendet reflektion, um zu kopieren, der alle Eigenschaften seiner Art clonig..
bitte lassen Sie mich wissen, wenn Sie haben Zweifel mehr.
Ist der beste Ansatz meiner Meinung nach wäre ein problem zu lösen, das erfordert ein nachdenken zu lösen (zum Glück) die meisten Probleme eigentlich nicht erfordern den Einsatz von Reflexion überhaupt, aber wenn Sie es tun, es kommt in handliches.
Dem letzten problem, das ich zu lösen hatte, mit Reflexion war einen benutzerdefinierten XMLSerializer - /Deserializer, wo ich hatte ich einige string-Typ-annotation und einen string-Wert und wurde mit der spiegelung neu zu erstellen und die Instanz des Typs (oder eine Liste von Arten) aus dem angegebenen string-Wert zur Laufzeit.
Dies erforderte
Activator.CreateInstance()
zum erstellen der Instanz einer generischen Liste vom TypTypeConverter zu erstellen
Instanz des primitiven Typ
MethodInfo
hinzufügenprimitiven Typ, um die Liste mit ein
generische Methode zur Laufzeit.
Suchen Sie nach einem problem im Raum, dass Sie ansonsten gut gedeckt, dass erfordert nachdenken, und dann einfach drauf Los - learning by doing!
Wenn Sie wissen, alles, was zur compile-Zeit, dann müssen Sie nicht unbedingt jemals brauchen werden, um reflektion verwenden. Wie andere erwähnt, kann es nützlich sein, zu automatisieren Gebäude UI, Serialisierung, anderen code, dass wäre sonst einfach Standardcode, der tut die gleiche Sache über und über für mehrere Felder in einer Klasse.
Ich habe es in Fällen, in denen Sie zum laden eines dynamisch generierten plugin-dll zur Laufzeit. Dann können Sie die Abfrage der Montage für die Typen der Ableitung von einer bestimmten Basisklasse und instanziieren und verwenden Sie dann den Typ aus der plugin-dll.
Andere Weise zu verwenden (missbrauchen?) Reflexion zu umgehen Kapselung, und legen Sie einen privaten Bereich in einem anderen Objekt, wenn Sie wissen, dass der name des Feldes, obwohl, wenn Sie dies tun, müssen Sie sich ernsthaft Fragen, ob seine lohnt.