Wie liste ich eine Liste von Schnittstellen auf, die direkt in einer erbenden Klasse definiert sind?

8

Aktualisierte Frage gegeben, Andrew Hare richtige Antwort:

Gegeben die folgenden C # -Klassen:

%Vor%

Ich möchte eine Methode wie die folgende, die bei den Assertions nicht fehlschlägt ( Hinweis: Sie können die Assertionen nicht ändern ):

%Vor%

Kann jemand helfen, indem er diese Methode repariert, damit die Assertionen nicht fehlschlagen?

Der Aufruf von typeof(Bar).GetInterfaces() funktioniert nicht, da die gesamte Schnittstellenhierarchie zurückgegeben wird (d. h. interfaces variable enthält IEnumerable<int> , IEnumerable und IDisposable ), nicht nur die oberste Ebene.

    
Jordan 25.03.2010, 19:35
quelle

6 Antworten

7

Versuchen Sie Folgendes:

%Vor%

Verwendung:

%Vor%

Wie bereits erwähnt, funktioniert dies nur, wenn der überprüfte Typ explizit eine einzelne Schnittstelle implementiert. Wenn Sie mehrere haben, müssen Sie Ihre Assert ändern.

    
Cheeso 25.03.2010, 20:11
quelle
2

Andrew Hare stimmt, dass Sie die angegebene Liste der Schnittstellen nicht über Reflektion abrufen können. Sie können jedoch die "Top-Level" -Schnittstellen finden, indem Sie Schnittstellen ausschließen, die von anderen impliziert werden. Sie könnten es wie folgt implementieren:

%Vor%

Dies gibt Ihre Behauptungen weiter.

    
Mark Byers 25.03.2010 19:51
quelle
2

Sie wollen nur die Schnittstellen der ersten Ebene, oder? Du könntest etwas LINQ und Reflexion einbauen; Schließen Sie einfach alles aus, was der Basistyp implementiert.

%Vor%     
joshua.ewer 25.03.2010 19:52
quelle
2

Es gibt wirklich keine Möglichkeit, dies zu tun, da Sie alle Schnittstellen aus der Schnittstellenhierarchie abrufen. Das heißt, wenn Sie IEnumerable<T> implementieren, implementieren Sie implizit auch IEnumerable .

Mit anderen Worten, wenn Sie sich die IL für die Klasse ansehen, die Sie erstellt haben, sehen Sie Folgendes:

%Vor%

Obwohl Sie nur angegeben haben, dass Ihr Typ IEnumerable<T> implementiert, hat der Compiler IL ausgegeben, die angibt, dass Ihr Typ IEnumerable<T> und IEnumerable implementiert.

Die Reflexions-API gibt glücklich zurück, was Sie tatsächlich für den Typ definiert haben (dh Ihr Typ implementiert beide Schnittstellen - was er tatsächlich tut). Mit dem C # -Compiler können Sie nur auf den untersten Typ in der Schnittstellenhierarchie verweisen, da er die anderen Schnittstellen, die Ihr Typ ebenfalls implementiert, ausfüllt. Dies ist eine der Möglichkeiten, die die Vererbung der Schnittstelle von der Typvererbung unterscheidet.

    
Andrew Hare 25.03.2010 19:41
quelle
0

Hinweis: Aktualisiert, um auch übernommene Schnittstellen zu filtern.

Sie können Basisschnittstellenelemente wie folgt ausschließen:

%Vor%     
Morten Mertner 25.03.2010 19:55
quelle
0

Ich würde es schreiben als:

%Vor%

Aber es ist schwer zu beantworten, ohne zu wissen, was Sie versuchen zu testen. Unabhängig davon sollten Sie sich nicht auf die Bestellung verlassen Bei Verwendung von GetInterfaces gibt diese Methode ein leeres Array zurück, wenn der Typ keine implementiert, daher wird die Nullprüfung nicht benötigt.

Edit: Wenn Sie die Assertionen wirklich nicht ändern können, dann ist das Sicherste:

%Vor%     
Jamie Ide 25.03.2010 19:48
quelle

Tags und Links