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.
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.
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% 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.
Hinweis: Aktualisiert, um auch übernommene Schnittstellen zu filtern.
Sie können Basisschnittstellenelemente wie folgt ausschließen:
%Vor%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%Tags und Links class c# reflection interface