Visual Studio: Wie zeige ich alle Klassen an, die von einer Basisklasse geerbt wurden?


139

Wie zeige ich in Visual Studio alle Klassen an, die von einer Basisklasse geerbt wurden?

Zum Beispiel , in ASP.NET MVC gibt es mehrere ‚ Action ‘ Typen - und sie alle vererben / implementieren , um die Basisklasse ActionResult.

Es sieht so aus, als ob Sie diese Informationen nicht einfach herausfinden können, es sei denn, Sie wissen das nur Viewund Jsonsind gültige ActionResultTypen.

Bitte beweise mir das Gegenteil.

Gibt es etwas im Objektbrowser, das es einfach macht, dies herauszufinden?

Ich bin sogar bereit, Vorschläge für Tools außerhalb von Visual Studio zu machen, um diese Informationen zu verschiedenen Klassen zu erhalten. Zum Beispiel: Gibt es etwas in Resharper, das mir helfen wird?


2
Mit Visual C # 2010 Express suche ich in der Lösung nach ": ActionResult". Nicht ideal, aber besser als nichts.
Yoyo

2
Ich denke, Sie verstehen meine Frage falsch. JsonResult (Referenz hier: msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx ) erbt von ActionResult. Es gibt mehrere andere Klassen, die von ActionResult erben. Was ist eine einfache Möglichkeit, alle Klassen anzuzeigen, die von ActionResult erben?
Dan Esparza

3
In diesem Fall ist der von mir verwendete Code kein Code, der direkt in meiner Lösung angezeigt wird. Sie sind MVC-Framework-Klassen in einer anderen Assembly. Die Suche nach ": ActionResult" funktioniert nicht für Code, den ich aus einer Assembly verwende.
Dan Esparza

Antworten:


51

Sicher, Resharper kann das. Und vieles mehr.

Klicken Sie einfach mit der rechten Maustaste auf den Typnamen an einer beliebigen Stelle und wählen Sie im Kontextmenü "Gehe zu Vererbung". "Gehe zu Vererbung" kann auch auf die Methode zum Navigieren zu Überschreibungen und die Implementierungen einer Schnittstellenmethode angewendet werden. Für eine Benutzeroberfläche können Sie erneut "Find Usages Advanced" aufrufen (klicken Sie einfach mit der rechten Maustaste), um alle Erweiterungen und Implementierungen zu finden. Für einen vom Typ abgeleiteten Typ. Und meine Lieblingsfunktion - klicken Sie mit gedrückter Strg-Taste auf einen beliebigen Typ / eine beliebige Methode, um zu seiner Deklaration zu navigieren.

Ich denke, es ist ein Muss für .net-Entwickler.


Klicken Sie in Resharper 9.2 bei einem beliebigen Quellcode-Typ mit der rechten Maustaste auf "Find Usage Advanced", wählen Sie Find = "Derived" und Scope = "Solutions and Libraries".
Um beispielsweise alle Erben (sowohl in der Bibliothek als auch in Ihrem Code) einer Basisklasse in einer enthaltenen DLL eines beliebigen Anbieters zu finden, deklarieren Sie eine Variable in Ihrem Code mit dieser Basisklasse. Klicken Sie dann mit der rechten Maustaste auf den Namen der Basisklasse, den Sie gerade eingegeben haben.


6
So eine Schande. Java-Entwickler, die die kostenlose Eclipse verwenden, verfügen über diese sofort einsatzbereite Funktionalität. In meinem Resharper + VS2015 wird "Gehe zur Implementierung" und nicht "Gehe zum Vererbten" angezeigt.
Nordpol

1
Aber das gibt mir nicht die Klassen in der Mitte, sondern geht nur. STRG + ALT + B würde die Antwort geben.
Nordpol

2
Visual Studio 6 hatte es vor fast 20 Jahren in C ++ - Projekten. Der Objektbrowser und das Klassendiagramm bieten nicht die gleiche geringe Fähigkeit, Vererbungsbäume umzudrehen. Ich habe kürzlich festgestellt, dass Eclipse eine großartige Version davon hat, zumindest mit Java. Komm schon, MS, ruf einen deiner Ex-Entwickler an und frage, was du aber verloren hast ... Zugegeben, es erforderte alle Projekte, die BSC-Suchdaten nach dem Kompilieren zu generieren, aber das war in Ordnung. Es war wirklich.
Philip Beck

150

Für VS2012

  1. Navigieren Sie im Solution Explorer zur Datei
  2. Erweitern Sie und wählen Sie Ihre Klasse aus
  3. Klicken Sie mit der rechten Maustaste auf das Klassenelement (nicht auf das Dateielement) -> Abgeleitete Typen

9
Dies setzt den von Ihnen geschriebenen Quellcode voraus. Wie würde dies mit dem in der ursprünglichen Frage angegebenen Beispiel funktionieren? (ActionResult-Typen)
Dan Esparza

Wenn Sie einen Typ haben, der von ActionResult abgeleitet ist, können Sie mit der rechten Maustaste auf Ihren Typ klicken und Basistypen auswählen. Dadurch gelangen Sie zu ActionResult, auf das Sie jetzt mit der rechten Maustaste klicken und Abgeleitete Typen auswählen können. (Wenn Sie keinen Typ haben, der von ActionResult abgeleitet ist, können Sie sich zurück zu System.Object und dann zu ActionResult arbeiten.)
yoyo

21
Für diejenigen unter Ihnen, die wie ich mit der rechten Maustaste auf die Codedatei der Klasse geklickt haben und sich nicht sicher waren, warum es keine Menüoption "Abgeleitete Typen" gab: Denken Sie daran, dass Sie zuerst das Codedateielement erweitern müssen, um das Klassenelement anzuzeigen - und dann Rechtsklick.
BCA

3
Ich verwende VS 2017. Leider werden hier nur die Klassen angezeigt, die in derselben Assembly vorhanden sind. Es wird nicht die gesamte Lösung angezeigt.
NightOwl888

4
Es ist seltsam, wie diese Funktionalität im Projektmappen-Explorer vorhanden ist, nicht jedoch in der Klassenansicht.
Dai

73

Hierfür benötigen Sie nicht unbedingt Reflector. In der Ansicht "Klassendiagramm" von Visual Studio können Sie problemlos alle abgeleiteten Klassen für eine bestimmte Klasse finden. Klicken Sie mit der rechten Maustaste auf die Klasse in "Klassenansicht" und wählen Sie "Klassendiagramm anzeigen". Wenn das Diagramm nicht den gewünschten Detaillierungsgrad für die Hierarchie anzeigt, klicken Sie mit der rechten Maustaste auf das Feld für die Klasse im Diagramm und wählen Sie "Abgeleitete Klassen anzeigen".

Möglicherweise nicht so direkt wie Resharper, aber es ist eine Option, wenn Sie noch kein R # haben.

Leider bin ich mir nicht sicher, welche bestimmten Versionen von Visual Studio es haben.


15
Auf diese Weise können Sie nur die Klassen in Ihrer Lösung anzeigen, die die Zielklasse / Schnittstelle erben / implementieren. Gut zu wissen.
Markus Jarderot

Kennen Sie die Einschränkungen dieser Methode? Da ich nicht alle Unterklassen sehen kann (anscheinend werden nur Unterklassen angezeigt, die keine zusätzlichen Schnittstellen implementieren).
Serge

1
Ich habe die Fehlermeldung "Es gibt keine Typen, die von XXX im aktuellen Projekt abgeleitet sind" erhalten, daher denke ich, dass dies auf Typen im aktuellen Projekt beschränkt ist, nicht auf die Lösung
Andy

Kann ich "Abgeleitete Klassen anzeigen" rekursiv ausführen? Oder muss ich für jede Unterklasse explizit "Abgeleitete Klassen anzeigen" auswählen?
James Wierzba

15

Dies ist die am wenigsten faule Antwort (ich bin nur stolz auf diese Antwort :)

Ich habe ReSharper nicht, habe es schon einmal versucht, wollte es aber nicht kaufen. Ich habe ein Klassendiagramm ausprobiert, aber es ist überhaupt nicht praktikabel, da das Hierarchiediagramm die Welt dreimal überspannt und der Bildschirm meines Laptops nicht unendlich breit ist. Meine natürliche und einfache Lösung bestand darin, Windows Forms-Code zu schreiben, um die Typen in einer Assembly zu durchlaufen und mithilfe der Reflektion Knoten zu einer Baumansicht hinzuzufügen:

Bitte nehmen Sie an, dass Sie ein Textfeld, eine Baumansicht und andere Dinge haben, die in einem Formular benötigt werden, in dem dieser Code ausgeführt wird

//Go through all the types and either add them to a tree node, or add a tree
//node or more to them depending whether the type is a base or derived class.
//If neither base or derived, just add them to the dictionary so that they be
//checked in the next iterations for being a parent a child or just remain a
//root level node.

var types = typeof(TYPEOFASSEMBLY).Assembly.GetExportedTypes().ToList();
Dictionary<Type, TreeNode> typeTreeDictionary = new Dictionary<Type, TreeNode>();
foreach (var t in types)
{
    var tTreeNode = FromType(t);
    typeTreeDictionary.Add(t, tTreeNode);

    //either a parent or a child, never in between
    bool foundPlaceAsParent = false;
    bool foundPlaceAsChild = false;
    foreach (var d in typeTreeDictionary.Keys)
    {
        if (d.BaseType.Equals(t))
        {
            //t is parent to d
            foundPlaceAsParent = true;
            tTreeNode.Nodes.Add(typeTreeDictionary[d]);
            //typeTreeDictionary.Remove(d);
        }
        else if (t.BaseType.Equals(d))
        {
            //t is child to d
            foundPlaceAsChild = true;
            typeTreeDictionary[d].Nodes.Add(tTreeNode);
        }
    }

    if (!foundPlaceAsParent && !foundPlaceAsChild)
    {
        //classHierarchyTreeView.Nodes.Add(tn);
    }
}

foreach (var t in typeTreeDictionary.Keys)
{
    if (typeTreeDictionary[t].Level == 0)
    {
        classHierarchyTreeView.Nodes.Add(typeTreeDictionary[t]);
    }
}

StringBuilder sb = new StringBuilder();
foreach (TreeNode t in classHierarchyTreeView.Nodes)
{
    sb.Append(GetStringRepresentation(t, 0));
}
textBox2.Text = sb.ToString();

2
+1 für ein cooles Codebeispiel. Was ist mit Basisklassen und abgeleiteten Klassen in anderen Assemblys?
ToolmakerSteve

@ ToolmakerSteve, wie wäre es AppDomain.CurrentDomain.GetAssemblies()? Schauen Sie sich das an: stackoverflow.com/questions/851248/…
Mzn

14

Ab 'Visual Studio 2015 Update 1' können Sie einfach mit der rechten Maustaste auf einen Klassennamen im Klassencode-Editor klicken und dann im Kontextmenü die Option 'Gehe zur Implementierung' auswählen: Strg + F12 ist die Verknüpfung.

Weitere Informationen finden Sie unter https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/ .


1
Ich schätze den Tipp, bin mir aber nicht sicher, ob dies meinen ursprünglichen Anwendungsfall betrifft, bei dem alle geerbten Klassen einer Basisklasse angezeigt werden.
Dan Esparza

3
@ DanEsparza: Zumindest in VS2017. Also habe ich die Antwort positiv bewertet
João Antunes

1
Es ist schön. Zeigt den Hierarchiebaum leider nicht an ... Ich liste nur alle in derselben Baumebene auf.
Lombas

Und wie immer ist der Name falsch, wurde bei meiner Suche / Verwendung völlig übersehen und musste zu StackOverflow kommen, um ihn zu finden!
dim8

10

Niemand hat dies bisher erwähnt, also werde ich es hinzufügen.
Jetbrains dotPeek ist ein kostenloser .NET-Dekompiler, mit dem diese Informationen einfach angezeigt werden können.

Kostenloser Download: http://www.jetbrains.com/decompiler/

Jetbrains ist das Unternehmen, das Resharper herstellt.

Schritte zum Finden abgeleiteter Klassen:

  1. Starten Sie dotPeek
  2. Wählen Sie 'Aus GAC öffnen ...' und fügen Sie die System.Web.MVC-Assembly hinzu
  3. Wählen Sie "Navigieren / Gehe zu Typ" und geben Sie ein ActionResult
  4. ActionResultKlicken Sie in der Klassendeklaration mit der rechten Maustaste und wählen Sie "Abgeleitete Symbole".
  5. Voila! Jede einzelne abgeleitete Klasse wird angezeigt (sogar einige, von denen ich nichts wusste!)

7

Angenommen, Sie haben Resharper installiert: Klicken Sie mit dem Cursor auf die Klasse / Schnittstelle mit der rechten Maustaste auf - Inspizieren - Hierarchien

Dies zeigt Unterklassen, Implementierungen und Oberklassen.


Hmmm ... interessant, aber nicht das, wonach ich gesucht habe. Wenn ich mit der rechten Maustaste auf ein zurückgegebenes ActionResult-Element klicke und diese Schritte befolge, erhalte ich die Optionen 'Inspect' für 'Controller' (den Typ der enthaltenen Klasse). Wenn ich versuche, zur Definition von 'ViewResult' zu wechseln, bin ich in Metadaten und habe keine Möglichkeit, Hierarchien zu überprüfen.
Dan Esparza

1
Außerdem: Ich bin mir ziemlich sicher, dass dies eine Funktion von Resharper ist, sie ist nicht nativ in Visual Studio ...
Dan Esparza

7

Versuchen Sie es mit Visual Studio Class View

Navigieren Sie in der Visual Studio-Klassenansicht zu der gewünschten Klasse und suchen Sie deren Basis- und abgeleitete Klassen


3
Dies ist tatsächlich eine potenziell nützliche Ansicht. Leider ist es unglaublich langsam, verlinkt / folgt nicht dem aktuellen Editor und fühlt sich im Allgemeinen wie ein nachträglicher Einfall in VS an.
E-Riz

Dies zeigt alle Klassen, nicht nur die in Ihrer Lösung, und funktioniert sofort. Es ist nicht langsam. Verwenden Sie für eine grafischere Ansicht auch die integrierte Funktion "Klassendiagramm" (diese zeigt jedoch nur Klassen in Ihrer Lösung an). Das ist alles was ich jemals brauchen würde und das ist die beste Antwort.
Nikos

5

Sie können auch Reflector verwenden .

Laden Sie alle Assemblys, in denen sie angezeigt werden sollen, navigieren Sie zu einem Typ und erweitern Sie das Element Abgeleitete Typen.

Sie können dies auch im Objektbrowser tun, aber aus irgendeinem Grund kann VS2008 dies nur in einer der .NET Framework-Ansichten tun. (VS2010 Beta 2 kann dies in jeder Ansicht tun)


3
Reflektor kostet jetzt Geld, aber ILSpy wird das gleiche kostenlos tun.
Yooy

Es gibt eine kostenlose 30-Tage-Testversion, aber keine kostenlose Version, die Sie auf unbestimmte Zeit verwenden können. Es sei denn, Sie wissen etwas, was ich nicht weiß? Ich habe gerade Reflector.net überprüft .
Jojo

1
Es tut uns leid; Reflector hatte früher noch eine kostenlose Edition. Wann haben sie es losgeworden?
SLaks

2. Februar 2011 - zdnet.com/blog/burnette/…
yoyo

3
Was wirklich schrecklich war, ist, dass redgate (sie haben Reflector gekauft) nach diesem Datum die alte kostenlose Version gelöscht und durch die Testversion ersetzt hat, wenn Sie eine Kopie der zuvor heruntergeladenen kostenlosen Version ausgeführt haben. Ohne Vorwarnung. Und keine Option, um das "Upgrade" zu vermeiden. Das stimmt: Ich war nicht auf die Website des Unternehmens gegangen und hatte nichts von ihnen heruntergeladen. Aber es gab eine Lizenzierungslogik im alten ReSharper, die zu ihnen umgeleitet wurde und es ihnen ermöglichte, die Kopie, die ich hatte, zu deaktivieren. Ich habe geschworen, unter keinen Umständen etwas von redgate zu kaufen oder auf andere Weise ihre Existenz zu fördern.
ToolmakerSteve


4

Mit Hilfe von ReSharper (Version 2016.1.2) nur Ctrl+ Alt+ Clickauf die Basisklasse . Sie werden so etwas sehen:

siehe abgeleitete Klassen reSharper


1
+1 Schön! Es scheint also, dass die in der Liste fett gedruckten Klassennamen direkt von der ausgewählten Basisklasse erben und die nicht fett gedruckten Klassennamen in der Liste indirekt von der ausgewählten Basisklasse erben?
Simon Bosley

Genau. Bald wird bei den direkt erbenden Klassen sein.
Devid


1

Wählen Sie den Typ aus und klicken Sie mit der rechten Maustaste, um etwas anzuzeigen --- auf der Codekarte anzeigen - Option Wählen Sie es aus, um das Bildformat für diejenigen zu generieren, die diesen Typ erben


1

Als Option für Benutzer von Visual Assist können Sie auch Umschalt + ALT + G drücken (während sich das Caret im Klassennamen befindet), um das Kontextmenü "Springen" aufzurufen. Wenn abgeleitete Klassen vorhanden sind, wird ein Untermenü angezeigt dafür listet das sie alle auf und zeigt sogar Vererbungsstrukturen unter diesen abgeleiteten Klassen.


0

Codiere es einfach.

Assembly asm = Assembly.LoadFrom(PATH_TO_PROJECT_OUTPUT);

var types = from t in asm.GetTypes()
            where t.BaseType != null && t.BaseType.ToString() == "System.Web.UI.Page"
            // if you want to add reference - where typeof (System.Web.UI.Page).Equals(t.BaseType) 
            select t;

foreach (var type in types)
{
    Console.WriteLine(type);
}

2
Leider werden hier nur die Typen angezeigt, die direkt von einer bestimmten Klasse erben, nicht diejenigen, die indirekt von einer Klasse erben. Dafür müssten Sie wahrscheinlich so etwas wie das verwenden, was MZN geschrieben hat.
user420667

Oder Sie können t.IsSubClassOf (Zielklasse) verwenden.
user420667

0

Wenn Sie auf VS2012 aktualisiert haben, können Sie die "Code Map" verwenden.
Klicken Sie mit der rechten Maustaste auf den Typ, dessen Vererbungshierarchie Sie anzeigen möchten, und wählen Sie "Zur Codezuordnung hinzufügen". Anschließend können Sie in der Codezuordnungsansicht Knoten erweitern und mit der rechten Maustaste "Abgeleitete Klassen / Basisklassen anzeigen" auswählen. Leider funktioniert es nicht für die von .NET bereitgestellten Klassen.


4
Dies gilt nur für VS2012 Ultimate mit installiertem Update 1. Premium / Pro-Leute können diese Karten leider nicht erstellen.
Sean Hanley

0

Für Visual Studio 2012 ( ohne ReSharper )

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Klasse (deren abgeleitete Klassen Sie sehen möchten).
  2. Klicken Sie im Klassendiagramm mit der rechten Maustaste auf die Klasse und wählen Sie "Abgeleitete Klassen anzeigen".

1
Soweit ich das beurteilen kann, werden hier nur abgeleitete Klassen angezeigt, die Sie geschrieben haben. Wie würde dies mit dem in der ursprünglichen Frage angegebenen Beispiel funktionieren? (ActionResult-Typen)
Dan Esparza

0

Update 2020:

Sie können die Code Maps von Visual Studio verwenden, was ziemlich gut funktioniert.

Klicken Sie einfach rechts auf die Klasse und navigieren Sie zu:
Code Map> Show Related Items on Code Map>Show All Derived Types

Geben Sie hier die Bildbeschreibung ein

Hinweis:

  • Diese Funktion ist nur in der Enterprise Edition von Visual Studio verfügbar. Wenn Sie diese nicht haben , können Sie sie kostenlos herunterladen, indem Sie die Enterprise Preview-Version von hier herunterladen .
  • Oder Sie können einfach jemanden aus Ihrem Team bitten, die Codekarte mit dieser Funktion zu teilen, wenn er über diese Edition verfügt.

PS Es lohnt sich wirklich, die Enterprise-Version (oder zumindest die Vorschau-Version davon) auf Ihrem Computer zu behalten, da sie eine Reihe wirklich nützlicher Tools enthält , die in den anderen Editionen nicht enthalten sind.


1
Es scheint, dass dies nur für Typen funktioniert, für die Sie die Quelle haben. Nicht Dinge wie ActionResult(das Beispiel des OP)
Iain

-1

Eine sehr einfache Möglichkeit, dies zu tun, besteht darin, : Classnameim Fenster "Suchen und Ersetzen" (STRG + F) nach zu suchen und die Option "Optionen suchen / Ganzes Wort abgleichen" zu verwenden. Sie finden nur die geerbten Klassen.


1
Dies funktioniert nicht jedes Mal, bedenken Sieclass DDerived : IInterface, BBase
Jirkamat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.