Wie finden Sie alle Implementierungen einer Schnittstelle?

70

Angenommen, Sie haben eine in C # definierte Schnittstelle. Was ist die einfachste Methode, um alle Klassen zu finden, die eine Implementierung der Schnittstelle bereitstellen?

Die Brute-Force-Methode besteht darin, "Verweise suchen" in Visual Studio zu verwenden und die Ergebnisse manuell zu durchsuchen, um die Verwendungen von den Implementierungen zu trennen. Bei einer Schnittstelle in einer großen Codebasis, auf die mit relativ wenigen Implementierungen stark verwiesen wird , kann dies jedoch der Fall sein zeitaufwändig und fehleranfällig.

In Java läuft javadoc auf der Code - Basis (die -privater Option privaten Klassen enthalten) würde eine Dokumentationsseite für die Schnittstelle (zB erzeugen Vergleichbar ) , die alle implementierenden Klassen für die Schnittstelle sowie alle Subinterfaces enthält (obwohl es nicht der Fall ist einschließlich der Implementierung von Klassen der Subschnittstellen, diese sind relativ einfach zu bestimmen, indem ein Drilldown in die aufgelisteten Subschnittstellen durchgeführt wird. Es ist diese Funktionalität, die ich suche, aber mit C # und Visual Studio.

Ich bin Michael
quelle

Antworten:

36

(Bearbeiten basierend auf Kommentar ...)

Wenn Sie ReSharper installiert haben:

Klicken Sie in Visual Studio mit der rechten Maustaste auf den Typnamen und wählen Sie "Gehe zu Vererbung". Alternativ können Sie den Typnamen auswählen und dann zu ReSharper / View / Type Hierarchy wechseln, um eine neue Registerkarte zu öffnen. (Das Menü zeigt Ihnen die Tastenkombination - diese kann variieren, weshalb ich erklärt habe, wie man sie findet :)

Wenn Sie ReSharper nicht haben:

  • Sie können Reflector verwenden , mit dem Sie die gesamte Typhierarchie sehr einfach anzeigen können. Direkt unter dem Typnamen befinden sich erweiterbare Elemente für Basistypen und abgeleitete Typen. Ähnliche Tools wie ILSpy und dotPeek sind verfügbar .
  • ReSharper kaufen - es ist ein großartiges Tool :)
Jon Skeet
quelle
ReSharper ist bereits auf meiner Liste der Anfragen; Ich dachte, es hätte wahrscheinlich die Fähigkeit, aber leider habe ich es noch nicht. Mit Reflector konnte ich die Antwort auf meine spezifische Suche erhalten, obwohl es ein bisschen mühsam war, alle Baugruppen zu finden und hinzuzufügen, die auf die Baugruppe mit der Schnittstellendefinition verweisen!
Iammichael
Reflektor ist nicht frei
berühmt
1
@beruic: Nicht mehr - es war zurück, als ich das schrieb, denke ich :) Wird einige kostenlose Optionen hinzufügen ...
Jon Skeet
@ JonSkeet durchsucht Resharper sogar die DLLs von Drittanbietern? Ich möchte beispielsweise die Implementierungen für eine Schnittstelle in einem NuGet-Paket sehen und die Implementierungen befinden sich in diesem Paket.
Wahid Bitar
1
@WahidBitar: Ich würde erwarten, dass dies innerhalb von Baugruppen in Ihrem Projekt geschieht. Ich schlage vor, Sie versuchen es :)
Jon Skeet
103

Sie können mit der rechten Maustaste auf einen Methodennamen klicken (Definition in der Schnittstelle oder Implementierung in einer anderen Klasse) und Aufrufhierarchie anzeigen auswählen. Im Fenster Anrufhierarchie befindet sich der Ordner "Implementiert", in dem Sie alle Speicherorte der Implementierung der Schnittstellenmethode finden.

phoose
quelle
Ich sehe keine solche
Menüoption
1
Verfügbar seit VS2010 - ich habe es gerade in VS2013 Express versucht und es ist auch da - sehr schön, eine Alternative zu F12 zu haben, die in Code, der Abhängigkeitsinjektion verwendet, nicht immer dahin geht, wo Sie es erwarten.
J c
9
Dies sollte die akzeptierte Antwort sein, da sie (a) die Arbeit erledigt und (b) sich nicht auf [bezahlte] Tools von Drittanbietern verlässt
NekojiruSou
24

Setzen Sie den Cursor auf Klassen- oder Schnittstellentyp und

STRG + F12

Bahtiyar Özdere
quelle
2
Beachten Sie, dass dies nur in Visual Studio 2015 Update 1 und höher funktioniert.
Nik A.
14

Mit Visual Studio 2010+

Klicken Sie mit der rechten Maustaste auf eine Mitgliedsmethode und wählen Sie Ansichtshierarchie anzeigen. Erweitern Sie den Ordner Implements. Hier werden alle Typen aufgelistet, die die Schnittstelle implementieren, zu der die Methode gehört.

Geben Sie hier die Bildbeschreibung ein

Mit Resharper 7

Klicken Sie mit der rechten Maustaste auf die Benutzeroberfläche> Navigieren zu> Abgeleitete Symbole. Die fett aufgelisteten Symbole stammen direkt von der Benutzeroberfläche. Nicht fette Symbole stammen aus einer Oberklasse.

Geben Sie hier die Bildbeschreibung ein

P.Brian.Mackey
quelle
10

Für diejenigen, die Visual Studio 2015 verwenden, gibt es diese großartige Erweiterung namens Go To Implementation . Versuche es.

Sobald Sie die Erweiterung installiert haben, können Sie mit der rechten Maustaste auf alle Vorkommen der Benutzeroberfläche (z. B. IUrlShortener) klicken und auf das Go To ImplementationMenü klicken . Wenn Sie nur eine Klasse haben, die die Schnittstelle implementiert, gelangen Sie durch Klicken auf das Menü direkt zur Klasse. Wenn Sie mehr als eine Klasse haben, die die Schnittstelle implementiert, werden alle Klassen aufgelistet.

Nik A.
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
ForceMagic
@ForceMagic welche "wesentlichen Teile der Antwort"? Es ist ein Link zu einer herunterladbaren Erweiterung. Ich werde der Antwort jedoch weitere Erklärungen hinzufügen, danke.
Nik A.
Schließlich! Obwohl ich immer noch nicht glauben kann, dass diese entscheidende Funktion in VS fehlt.
Wziska
3
@wziska Wie Sie möchten, ist diese Funktion jetzt in Visual Studio 2015 Update 1 RC implementiert :)
Nik A.
8

Installieren Sie für Benutzer von Visual Studio 2015 Visual Studio 2015 Update 1 RC. Aus dem Visual Studio-Blog :

Heute haben wir Visual Studio 2015 Update 1 RC veröffentlicht, das auf dem vor drei Wochen veröffentlichten Update 1 CTP aufbaut. Zusätzlich zu den hier beschriebenen Funktionen des CTP enthält der Release Candidate Folgendes:

  • Gehen Sie zur Implementierung . Die Funktion, auf die viele von Ihnen gewartet haben: Klicken Sie einfach mit der rechten Maustaste auf eine Schnittstelle oder eine abstrakte Methode und wählen Sie diesen Befehl aus, um zur Implementierung zu navigieren.
Nate Cook
quelle
1
Der Hotkey dafür ist CTRL+F12
Alexandru
2

Ich glaube nicht, dass diese Funktionalität in VS integriert ist, aber IIRC Resharper hat dies.

Mohit Chakraborty
quelle
2

Sie können eine Suche nach regulären Ausdrücken für die Schnittstelle durchführen.

:(\ *[^},]+,)*\ *IMyInterfaceName

STRG + UMSCHALT + F öffnet das folgende Fenster:

Visual Studio Screenshot

Kees C. Bakker
quelle
2

Ich bevorzuge die Option "Navigieren zu ...". Versuchen Sie Folgendes, während sich der Cursor auf dem Funktionsaufruf befindet:

Tastenkürzel:

  1. Strg +, (Strg + Komma)

Speisekarte:

  1. Menü bearbeiten
  2. Klicken Sie auf "Navigieren zu ..."

Leistungen:

  • Zeigt nicht alle Referenzen wie "Alle Referenzen suchen" an
  • Zeigt den "Typ" der Implementierung an, damit notiert wird, welche Ihre Schnittstelle ist
Tony L.
quelle
1

Verwenden Sie Umschalt + F12, um alle Referenzen einschließlich der Definitionen anzuzeigen.

Akira Yamamoto
quelle
0

Wenn Sie die Resharper- Verknüpfung ALT + END verwenden, können Sie möglicherweise alle Inheritors finden.

Canavar
quelle
0

Ich habe gehört (keine Erfahrung selbst), dass Sauerstoff zu .Net ist, wie Javadoc zu Java ist.

überschwemmt
quelle