Ich versuche, meinen Kopf um Reflexion zu wickeln, also habe ich beschlossen, einem Programm, das ich schreibe, Plugin-Fähigkeit hinzuzufügen. Die einzige Möglichkeit, ein Konzept zu verstehen, besteht darin, sich die Finger schmutzig zu machen und den Code zu schreiben. Also habe ich eine einfache Interface-Bibliothek erstellt, bestehend aus den Interfaces IPlugin und IHost, einer Plugin-Implementierungsbibliothek mit Klassen, die IPlugin implementieren Konsolenprojekt, das die IHost-Implementierungsklasse instanziiert, die einfache Arbeit mit den Plugin-Objekten leistet.Wie man Objekte, die durch Reflektion erzeugt wurden, richtig ausgießt
Mit Reflektion wollte ich die Typen in meiner Plugin-Implementierungs-DLL durchlaufen und Instanzen von Typen erstellen. Ich konnte Klassen mit diesem Code erfolgreich instanziieren, aber ich konnte das erstellte Objekt nicht an die Schnittstelle übergeben.
Ich habe diesen Code versucht, aber ich konnte Objekt nicht wie erwartet o werfen. Ich bin mit dem Debugger durch den Prozess gegangen und der richtige Konstruktor wurde aufgerufen. Das Quickwatching-Objekt o zeigte mir, dass es die Felder und Eigenschaften hatte, die ich in der Implementierungsklasse erwartet hatte.
loop through assemblies
loop through types in assembly
// Filter out unwanted types
if (!type.IsClass || type.IsNotPublic || type.IsAbstract)
continue;
// This successfully created the right object
object o = Activator.CreateInstance(type);
// This threw an Invalid Cast Exception or returned null for an "as" cast
// even though the object implemented IPlugin
IPlugin i = (IPlugin) o;
Ich machte den Code damit arbeiten.
using System.Runtime.Remoting;
ObjectHandle oh = Activator.CreateInstance(assembly.FullName, type.FullName);
// This worked as I intended
IPlugin i = (IPlugin) oh.Unwrap();
i.DoStuff();
Hier sind meine Fragen:
- Activator.CreateInstance (Typ t) gibt ein Objekt, aber ich konnte das Objekt an einer Schnittstelle, die das Objekt implementiert nicht gegossen. Warum?
- Sollte ich eine andere Überladung von CreateInstance() verwendet haben?
- Was sind die Tipps und Tricks zur Reflektion?
- Gibt es einen entscheidenden Teil der Reflexion, die ich gerade nicht bekomme?
Vielleicht ein wenig übertrieben für eine einfache Anwendung, aber eine Alternative ist es, eine separate Bibliothek zu erstellen, die nur die Schnittstelle enthält und sie von allem, was sie darüber wissen müssen, zu beziehen: o) – Andrew
Ja, Sie haben Recht. das ist auch eine gültige Lösung. –