Visual Studio: come posso mostrare tutte le classi ereditate da una classe base?


139

In Visual Studio, come posso mostrare tutte le classi ereditate da una classe base?

Ad esempio , in ASP.NET MVC ci sono diversi tipi di " ActionResult " e tutti ereditano / implementano la classe base ActionResult.

A meno che tu non lo sappia Viewe non sia un tipo Jsonvalido ActionResult, non è possibile trovare facilmente queste informazioni.

Per favore, dimostrami che mi sbaglio.

C'è qualcosa nel browser degli oggetti che lo rende facile da scoprire?

Sono anche pronto per suggerimenti di strumenti al di fuori di Visual Studio per scoprire queste informazioni su varie classi. Ad esempio: c'è qualcosa in Resharper che mi aiuterà?


2
Con Visual C # 2010 Express cerco la soluzione ": ActionResult". Non ideale, ma meglio di niente.
yoyo,

2
Penso che tu abbia frainteso la mia domanda. JsonResult (riferimento qui: msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx ) eredita da ActionResult. Esistono diverse altre classi che ereditano da ActionResult. Qual è un modo semplice per vedere tutte le classi che ereditano da ActionResult?
Dan Esparza,

3
In questo caso, il codice che sto usando non è il codice che appare direttamente nella mia soluzione. Sono classi del framework MVC in un altro assembly. La ricerca di ": ActionResult" non funzionerà per alcun codice che utilizzo da un assembly.
Dan Esparza,

Risposte:


50

Certo, Resharper può farlo. E altro ancora.

Basta fare clic destro sul nome del tipo in qualsiasi luogo e scegliere "Vai a ereditario" nel menu di scelta rapida. "Go To Inheritor" può anche essere applicato al metodo per navigare verso le sostituzioni e le implementazioni di un metodo di interfaccia. Per un'interfaccia è possibile chiamare nuovamente "Trova utenti avanzati", fare clic con il pulsante destro del mouse) dove trovare tutte le estensioni e le implementazioni. Per i tipi derivati ​​da un tipo. E la mia funzione preferita: fai clic tenendo premuto il controllo su qualsiasi tipo / metodo per passare alla relativa dichiarazione.

Penso che sia uno strumento indispensabile per gli sviluppatori .net.


In Resharper 9.2, su qualsiasi tipo di codice sorgente, fare clic con il tasto destro del mouse su "Trova utilizzo avanzato", selezionare Trova = "Derivato" e Ambito = "Soluzioni e librerie".
Ad esempio, per trovare tutti gli eredi (sia nella libreria che nel codice) di una classe di base in una DLL inclusa di qualsiasi fornitore, dichiarare una variabile nel codice con quella classe di base. Quindi fare clic con il tasto destro del mouse sul nome della classe di base appena digitato.


6
Che peccato. Gli sviluppatori Java che utilizzano Eclipse gratuito dispongono di questa funzionalità pronta all'uso. Nel mio Resharper + VS2015, vedo "vai a Implementazione" anziché "Vai a ereditario".
Polo Nord,

1
Ma questo non mi dà le lezioni nel mezzo, lascia solo. CTRL + ALT + B darebbe la risposta.
Polo Nord,

2
Visual Studio 6 ce l'aveva su progetti C ++ circa 20 anni fa. Il browser degli oggetti e il diagramma delle classi non offrono la stessa leggera capacità di capovolgere gli alberi ereditari. Recentemente ho scoperto che Eclipse ha una versione fantastica di questo, con almeno Java. Dai MS, telefona a uno dei tuoi ex sviluppatori e chiedi che cos'hai fatto ma che hai perso ... Concesso, ha richiesto a tutti i progetti di generare i dati di esplorazione BSC dopo la compilazione, ma andava bene. Lo era davvero.
Philip Beck,

150

Per VS2012,

  1. Passare al file in Esplora soluzioni
  2. Espandi e seleziona la tua classe
  3. Fare clic con il tasto destro del mouse sull'elemento della classe (non sull'elemento del file) -> Tipi derivati

9
Questo presuppone il codice sorgente che hai scritto. Come funzionerebbe con l'esempio indicato nella domanda originale? (ActionResult types)
Dan Esparza

Se si dispone di qualsiasi tipo derivato da ActionResult, è possibile fare clic con il pulsante destro del mouse sul tipo e selezionare Tipi di base, che porterà a ActionResult, sul quale è possibile fare clic con il pulsante destro del mouse e selezionare Tipi derivati. (Se non si dispone di alcun tipo derivato da ActionResult, è possibile tornare a System.Object e quindi fino ad ActionResult.)
yoyo

21
Per quelli di voi che, come me, hanno fatto clic con il pulsante destro del mouse sul file di codice della classe e sono rimasti sconcertati sul motivo per cui non esisteva l'opzione di menu "Tipi derivati": ricorda che devi prima espandere l'elemento del file di codice per rivelare l'elemento della classe - quindi tasto destro.
BCA,

3
Sto usando VS 2017. Sfortunatamente, questo mostra solo le classi esistenti nello stesso assembly, non mostra l'intera soluzione.
NightOwl888

4
È strano come questa funzionalità esista in Esplora soluzioni ma non in Class View.
Dai,

73

Non è necessario necessariamente Reflector per questo - la vista "Class Diagram" di Visual Studio ti consentirà di trovare facilmente anche tutte le classi derivate per una determinata classe. Fai clic con il tasto destro del mouse sulla classe in "Visualizzazione classe" e scegli "Visualizza diagramma di classe". Se il diagramma non mostra il livello di dettaglio desiderato per la gerarchia, fai clic con il pulsante destro del mouse sulla casella per la classe nel diagramma e scegli "Mostra classi derivate".

Potrebbe non essere diretto come Resharper, ma è un'opzione se non hai già R #.

Sfortunatamente, non sono sicuro di quali versioni particolari di Visual Studio ce l'hanno.


15
Ciò ti consentirà solo di visualizzare le classi all'interno della tua soluzione che ereditano / implementano la classe / interfaccia di destinazione. Buono a sapersi però.
Markus Jarderot,

Conosci i limiti di questo metodo? Perché non mi permette di vedere tutte le sottoclassi (sembra che mostri solo sottoclassi che non implementano alcuna interfaccia aggiuntiva).
Serge

1
Ho ricevuto un errore che diceva "Non ci sono tipi che derivano da XXX nel progetto corrente", quindi penso che sia limitato ai tipi nel progetto corrente, non alla soluzione
Andy

Posso eseguire ricorsivamente "Mostra classi derivate"? O devo selezionare "Mostra classi derivate" su ogni sottoclasse esplicitamente?
James Wierzba,

15

Questa è la risposta meno pigra (sono solo orgoglioso di questa risposta :)

Non ho ReSharper, l'ho provato prima ma non volevo acquistarlo. Ho provato un diagramma di classe ma non è affatto pratico perché il diagramma gerarchico attraversa il mondo 3 volte e lo schermo del mio laptop non ha una larghezza infinita. Quindi la mia soluzione naturale e semplice era scrivere del codice di Windows Form per scorrere i tipi in un assembly e usare la riflessione per aggiungere nodi a una vista ad albero, come segue:

supponiamo di avere una casella di testo, una vista ad albero e altre cose necessarie in un modulo in cui viene eseguito questo codice

//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 per un esempio di codice interessante. Che dire delle classi base e delle classi derivate in altri assiemi?
ToolmakerSteve

@ToolmakerSteve, che ne dici AppDomain.CurrentDomain.GetAssemblies()? Date un'occhiata a questo: stackoverflow.com/questions/851248/...
MZN

14

A partire da "Visual Studio 2015 Update 1" puoi semplicemente fare clic con il pulsante destro del mouse sul nome di una classe nell'editor del codice di classe e quindi selezionare "Vai all'implementazione" dal menu contestuale: con Ctrl + F12 come scorciatoia.

Vedi https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/ per maggiori dettagli.


1
Apprezzo il suggerimento, ma non sono sicuro che questo risolva il mio caso d'uso originale di vedere tutte le classi ereditate da una classe base.
Dan Esparza,

3
@DanEsparza: lo fa, almeno in VS2017. Quindi ho votato a favore della risposta
João Antunes,

1
È carino. Sfortunatamente, non mostra l'albero della gerarchia ... Elenco solo tutti nello stesso livello dell'albero.
Lombas,

E come sempre il nome è falso, completamente ignorato durante la mia ricerca / utilizzo, è dovuto venire su StackOverflow per trovarlo!
dim8

10

Nessuno lo ha ancora menzionato, quindi lo aggiungerò.
Jetbrains dotPeek è un decompilatore .NET gratuito che ha il potere di mostrare facilmente queste informazioni.

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

Jetbrains è la società che produce Resharper.

Passaggi per trovare le classi derivate:

  1. Avvia dotPeek
  2. Selezionare "Apri da GAC ​​..." e aggiungere l'assembly System.Web.MVC
  3. Seleziona "Naviga / Vai a digitare" e digita ActionResult
  4. Nella ActionResultdichiarazione di classe, fare clic con il tasto destro e selezionare "Simboli derivati"
  5. Ecco! Viene mostrata ogni singola classe derivata (anche alcune che non conoscevo!)

7

Supponendo di avere Resharper installato: con il cursore sulla classe / interfaccia, fare clic con il tasto destro - Ispeziona - Gerarchie

Questo mostra sottoclassi, implementazioni e superclassi.


Hmmm ... interessante, ma non quello che stavo cercando. Se faccio clic con il pulsante destro del mouse su un elemento ActionResult restituito e seguo questi passaggi, ottengo le opzioni "Ispeziona" per "Controller" (il tipo della classe contenente). Se provo ad andare alla definizione 'ViewResult', sono nei metadati e non ho l'opzione per Ispezionare Gerarchie.
Dan Esparza,

1
Inoltre: sono abbastanza sicuro che questa sia una funzione fornita da Resharper, non è nativa in Visual Studio ...
Dan Esparza,

7

Prova Visual Studio Class View

In Visual Studio Class View vai alla classe che ti interessa e trova le sue classi base e derivata


3
Questa è in realtà una vista potenzialmente utile. Purtroppo, è incredibilmente lento, non collega / segue l'editor corrente e in genere sembra un ripensamento in VS.
E-Riz,

Questo mostra tutte le classi, non solo quelle nella tua soluzione e funziona immediatamente. Non è lento Per una vista più simile a un grafico, utilizzare anche la funzione integrata Diagramma di classe (ma che mostra solo le classi all'interno della soluzione). Questo è tutto ciò di cui avrei mai bisogno e questa è la risposta migliore.
Nikos

5

Puoi anche usare Reflector .

Caricare tutti gli assiemi in cui si desidera guardare, passare a un tipo ed espandere l'elemento Tipi derivati.

Puoi anche farlo nel Browser degli oggetti, ma per qualche ragione VS2008 può farlo solo in una delle viste .Net Framework. (VS2010 Beta 2 può farlo in qualsiasi vista)


3
Reflector ora costa denaro, ma ILSpy farà lo stesso gratuitamente.
yoyo

C'è una prova gratuita di 30 giorni, ma nessuna versione gratuita è possibile utilizzare a tempo indeterminato. A meno che tu non sappia qualcosa che io non so? Ho appena controllato reflector.net .
yoyo

1
Scusate; Riflettore aveva ancora un'edizione gratuita. Quando se ne sono sbarazzati?
SLaks

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

3
Ciò che è stato davvero terrificante è che dopo quella data, se hai eseguito una copia della versione gratuita che avevi scaricato in precedenza, Redgate (hanno acquistato Reflector) ELIMINA la vecchia versione gratuita, sostituendola con la versione di prova. Senza alcun preavviso. E nessuna opzione per evitare l '"aggiornamento". Esatto: non ero andato sul sito Web dell'azienda e non avevo scaricato nulla da loro. Ma c'era una logica di licenza nel vecchio ReSharper che veniva reindirizzata a loro e permetteva loro di disattivare la copia che avevo. Ho promesso di non acquistare mai e poi mai da Redgate o incoraggiare in altro modo la loro esistenza.
ToolmakerSteve


4

Con l'aiuto di ReSharper (versione 2016.1.2) solo Ctrl+ Alt+ Clicksulla classe base. Vedrai qualcosa del genere:

vedere le classi derivate reSharper


1
+1 bello! Quindi sembra che i nomi delle classi che appaiono in grassetto nell'elenco siano ereditati direttamente dalla classe base selezionata, e i nomi delle classi nell'elenco che non sono in grassetto ereditano indirettamente dalla classe base selezionata?
Simon Bosley,

Esattamente. Testamento calvo rispetto alle classi che ereditano direttamente.
Devid,


1

seleziona il tipo e fai clic con il pulsante destro del mouse per vedere qualcosa --- mostra sulla mappa del codice - opzione selezionala genera il form di immagine per coloro che ereditano questo tipo di immagine molto bella come il formato di file .dgml fornisce molte più informazioni sul tipo


1

Come opzione per coloro che usano Visual Assist, puoi anche premere Maiusc + ALT + G (mentre il cursore è sul nome della classe) per visualizzare il menu di scelta rapida "Vai a correlati" e se ci sono classi derivate otterrai un sottomenu per quello che li elenca tutti fuori e mostra persino le strutture ereditarie tra quelle classi derivate.


0

Basta codificarlo.

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
Sfortunatamente questo ti dice solo i tipi che ereditano direttamente da una classe particolare, non quelli che ereditano indirettamente da una classe. Per questo probabilmente dovresti usare qualcosa di simile a quello che ha scritto MZN.
user420667

Oppure potresti usare t.IsSubClassOf (targetclass).
user420667,

0

se hai effettuato l'upgrade a VS2012 puoi utilizzare la "Mappa codici".
Fai clic con il tasto destro del mouse sul tipo di cui desideri visualizzare la gerarchia ereditaria e scegli "Aggiungi alla mappa del codice". Quindi nella vista della mappa del codice è possibile espandere i nodi e fare clic con il tasto destro del mouse per scegliere "Mostra classi derivate / base". Sfortunatamente non funziona per le classi fornite da .NET.


4
Cordiali saluti a chiunque altro, questo vale solo per VS2012 Ultimate con l'aggiornamento 1 installato. Purtroppo, le persone Premium / Pro non possono creare queste mappe.
Sean Hanley,

0

Per Visual Studio 2012 ( senza ReSharper )

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla classe (di cui si desidera visualizzare le classi derivate).
  2. Nel diagramma delle classi, fai clic con il pulsante destro del mouse sulla classe e seleziona "Mostra classi derivate".

1
Ancora una volta, per quanto posso dire, questo mostrerà solo le classi derivate che hai scritto. Come funzionerebbe con l'esempio indicato nella domanda originale? (ActionResult types)
Dan Esparza,

0

Aggiornamento 2020:

È possibile utilizzare le mappe dei codici di Visual Studio che funzionano abbastanza bene.

È sufficiente fare clic destro sulla classe e passare a:
Code Map> Show Related Items on Code Map>Show All Derived Types

inserisci qui la descrizione dell'immagine

Nota:

  • Questa funzione è disponibile solo sull'edizione Enterprise di Visual Studio e, in caso contrario , puoi scaricarla gratuitamente scaricando la versione di anteprima aziendale da qui .
  • Oppure potresti semplicemente chiedere a chiunque del tuo team di condividere la mappa del codice con questa funzione se ha quell'edizione.

PS Vale davvero la pena conservare la versione Enterprise (o almeno la versione di anteprima) nella tua macchina, in quanto ha un sacco di strumenti davvero utili che non sono inclusi nelle altre edizioni.


1
Sembra che funzioni solo per i tipi per i quali hai la fonte. Non cose come ActionResult(l'esempio del PO)
Iain,

-1

Un modo molto semplice per farlo è cercare : Classnamenella finestra "Trova e sostituisci" (CTRL + F) e utilizzare l'opzione "Trova opzioni / Trova parola intera". Troverai solo le classi ereditate.


1
Questo non funziona ogni volta, considerareclass DDerived : IInterface, BBase
jirkamat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.