Laden...

Interface implementiert?

Erstellt von thepaul vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.180 Views
T
thepaul Themenstarter:in
151 Beiträge seit 2005
vor 17 Jahren
Interface implementiert?

Hallo,

ich möchte in einem Programm prüfen, ob eine Klasse ein bestimmtes Interface implementiert.
Dafür benutze ich, wie hier beschrieben, das is-Schlüsselwort. Allerdings wird nie in die Abfrage gesprungen.

ein Codeausschnitt:

if (isValidPlugin(plugin))
                        {
                                if (plugin is IRenderer)//Bedingung wird nie erfüllt
                                    registerPlugin(plugin);
                        }

MfG ThePaul

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo thepaul,

wenn der Kontrollfluss tatsächlich bis zu der if-Abfrage kommt, aber dann nicht in den Then-Teil der Abfrage kommt, dann liegt das daran, dass das Objekt in plugin eben nicht dieses Interface IRenderer implementiert. Vielleicht hast du in verschiedenen Namespaces verschieden IRenderer-Interfaces oder du benutzt unterschiedliche Versionen der DLL, die IRenderer enthält.

herbivore

Q
214 Beiträge seit 2006
vor 17 Jahren

Hallo,
gibt denn die Methode isValidPlugin() überhaupt true zurück?

Des Weiteren musst du auch darauf achten, dass die Interface gleich sind. Wenn also das Plugin das Interface aus seiner Assembly bezieht und das Programm ebenso das Interface selber in der Assembly hat, so sind dies zwei verschiedene Interfaces und is trifft nicht mehr zu (obwohl beide Interfaces u.U. gleiche Methoden&Eigenschaften haben).
Deswegen muss das Plugin das Interface aus der gleichen Quelle beziehen, wie dein Hauptprogramm.

T
thepaul Themenstarter:in
151 Beiträge seit 2005
vor 17 Jahren

also isValidPlugin() gibt auf jeden Fall true zurück.

Das Problem ist wahrscheinlich die Version der Bibliothek, in der IRenderer liegt. Das Projekt liegt zusammen dem der Oberfläche und der PLugins in einem VS-Projekt.


- Projekt (VS-Projektmappe)
  - Bibliothek A (u.a. IRenderer)
  - verschiedene Pluginbibliotheken B (Abhängigkeit auf A gesetzt)
  - UI (Abhängigkeit auf A und B gesetzt)

Deshalb gehe ich eigentlich davon aus, das immer die aktuellste version beim kompilieren genutzt werden sollte.

MfG ThePaul

T
thepaul Themenstarter:in
151 Beiträge seit 2005
vor 17 Jahren

Ich hbae jetzt sichergestellt, dass die gleicher Version der Assambly verwendet wird. Die Namespaces sind auch gleich und es gibt nur ein Interface IRenderer.

Habt ihr noch irgendwelche Ideen, woran das scheitert?

S
8.746 Beiträge seit 2005
vor 17 Jahren

Das Interfacé, welches vom Hauptprogramm genutzt und vom Plugin implementiert wird, muss als eigenständiges Assembly (Dll) vorliegen (nix drin außer Interface).

T
thepaul Themenstarter:in
151 Beiträge seit 2005
vor 17 Jahren

Original von svenson
Das Interfacé, welches vom Hauptprogramm genutzt und vom Plugin implementiert wird, muss als eigenständiges Assembly (Dll) vorliegen (nix drin außer Interface).

Ist so. sollte auch nicht das Problem sein.

T
thepaul Themenstarter:in
151 Beiträge seit 2005
vor 17 Jahren
beispiel

ich habedas ganze nochmal ganz grob implementiert. Code ist im Anhang. Allerdings funktioniert es immer noch nicht.

T
512 Beiträge seit 2006
vor 17 Jahren

Ah ja alles klar. Das kann so natürlich nicht gehen, weil das in nem ganz anderen Kontext steht.

Bei dem Beispielcode den du angehängt hast, ist dieses "plugin" in Wirklichkeit ein Type. Also keine Instanz von IRenderer, sondern eine Beschreibung der Klasse, die IRenderer implementiert. Dort kannst du natürlich nicht mit "is" abfragen, "is" testet, ob eine Instanz einen gewissen Typ hat. Nicht, ob ein Type Objekt einen gewissen Typ beschreibt.

Hast du einen Type gegeben und willst testen, ob dieser ein Interface implementiert, dann musst du sowas machen:

if( typeof( IRenderer ).IsAssignableFrom( plugin ) )

Glaub ich jedenfalls. Die Funktion ist die richtige, ich bin nur nicht sicher, ob man die von plugin aufruft mit IRenderer als Parameter, oder andersrum... ich denke so wirds schon passen 😁

e.f.q.

Aus Falschem folgt Beliebiges

T
thepaul Themenstarter:in
151 Beiträge seit 2005
vor 17 Jahren

Danke,
funktioniert jetzt wunderbar. Ich habe wohl die Hilfe in Sachen is-Operator falsch verstanden.

Danke nochmal.

MfG ThePaul