Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Interface implementiert?
thepaul
myCSharp.de - Member



Dabei seit:
Beiträge: 151
Herkunft: Jena

Themenstarter:

Interface implementiert?

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Qwald
myCSharp.de - Member



Dabei seit:
Beiträge: 214

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
thepaul
myCSharp.de - Member



Dabei seit:
Beiträge: 151
Herkunft: Jena

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
thepaul
myCSharp.de - Member



Dabei seit:
Beiträge: 151
Herkunft: Jena

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Das Interfacé, welches vom Hauptprogramm genutzt und vom Plugin implementiert wird, muss als eigenständiges Assembly (Dll) vorliegen (nix drin außer Interface).
private Nachricht | Beiträge des Benutzers
thepaul
myCSharp.de - Member



Dabei seit:
Beiträge: 151
Herkunft: Jena

Themenstarter:

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
thepaul
myCSharp.de - Member



Dabei seit:
Beiträge: 151
Herkunft: Jena

Themenstarter:

beispiel

beantworten | zitieren | melden

ich habedas ganze nochmal ganz grob implementiert. Code ist im Anhang. Allerdings funktioniert es immer noch nicht.
Attachments
private Nachricht | Beiträge des Benutzers
Traumzauberbaum
myCSharp.de - Member



Dabei seit:
Beiträge: 512

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
thepaul
myCSharp.de - Member



Dabei seit:
Beiträge: 151
Herkunft: Jena

Themenstarter:

beantworten | zitieren | melden

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

Danke nochmal.

MfG ThePaul
private Nachricht | Beiträge des Benutzers