Visual Studio: comment afficher toutes les classes héritées d'une classe de base?


139

Dans Visual Studio, comment afficher toutes les classes héritées d'une classe de base?

Par exemple , dans ASP.NET MVC, il existe plusieurs types « ActionResult » - et ils héritent tous de / implémentent la classe de base ActionResult.

Il semble qu'à moins que vous ne le «sachiez» simplement Viewet que vous Jsonsoyez des ActionResulttypes valides , il n'y a aucun moyen de trouver facilement ces informations.

Veuillez me prouver le contraire.

Y a-t-il quelque chose dans le navigateur d'objets qui rend cela facile à découvrir?

Je suis même prêt à recevoir des suggestions d'outils en dehors de Visual Studio pour découvrir ces informations sur différentes classes. Par exemple: y a-t-il quelque chose dans Resharper qui m'aidera?


2
Avec Visual C # 2010 Express, je recherche la solution pour ": ActionResult". Pas idéal, mais mieux que rien.
yoyo

2
Je pense que vous avez mal compris ma question. JsonResult (référence ici: msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx ) hérite d'ActionResult. Il existe plusieurs autres classes qui héritent d'ActionResult. Quel est un moyen simple de voir toutes les classes qui héritent d'ActionResult?
Dan Esparza

3
Dans ce cas, le code que j'utilise n'est pas du code qui apparaît directement dans ma solution. Ce sont des classes de framework MVC dans un autre assembly. La recherche de ": ActionResult" ne fonctionnera pour aucun code que j'utilise à partir d'un assembly.
Dan Esparza

Réponses:


50

Bien sûr, Resharper peut le faire. Et beaucoup plus.

Faites un clic droit sur le nom du type à n'importe quel endroit et choisissez "Aller à l'héritier" dans le menu contextuel. "Go To Inheritor" peut également être appliqué à la méthode de navigation vers les remplacements et les implémentations d'une méthode d'interface. Pour une interface, vous pouvez appeler à nouveau "Find Usages Advanced", juste un clic droit) où trouver toutes les extensions et implémentations. Pour un type - types dérivés. Et ma fonctionnalité préférée - cliquez en maintenant la touche Contrôle sur n'importe quel type / méthode pour accéder à sa déclaration.

Je pense que c'est un outil indispensable pour les développeurs .net.


Dans Resharper 9.2, sur tout type de code source, rt-cliquez sur "Find Usage Advanced", sélectionnez Find = "Derived" et Scope = "Solutions and Libraries".
Par exemple, pour rechercher tous les héritiers (à la fois dans la bibliothèque et dans votre code) d'une classe de base dans une DLL incluse de n'importe quel fournisseur, déclarez une variable dans votre code avec cette classe de base. Cliquez ensuite avec le bouton droit sur ce nom de classe de base que vous venez de saisir.


6
Quel dommage. Les développeurs Java qui utilisent le logiciel gratuit Eclipse ont cette fonctionnalité prête à l'emploi. Dans mon Resharper + VS2015, je vois "aller à l'implémentation" plutôt que "Aller à l'héritier".
Northern Pole

1
Mais cela ne me donne pas les classes au milieu, ça ne fait que partir. CTRL + ALT + B donnerait la réponse.
Northern Pole

2
Visual Studio 6 l'avait sur des projets C ++ il y a près de 20 ans. Le navigateur d'objets et le diagramme de classes n'offrent pas la même capacité légère pour inverser les arbres d'héritage. J'ai récemment découvert qu'Eclipse en avait une excellente version, au moins avec Java. Allez MS, téléphonez à l'un de vos anciens développeurs et demandez ce que vous aviez mais perdu ... Certes, il fallait que tous les projets aient l'option de générer des données de navigation BSC après la compilation, mais c'était bien. C'était vraiment.
Philip Beck

150

Pour VS2012,

  1. Accédez au fichier dans l'explorateur de solutions
  2. Développez et sélectionnez votre classe
  3. Cliquez avec le bouton droit sur l'élément de classe (pas l'élément de fichier) -> Types dérivés

9
Cela suppose le code source que vous avez écrit. Comment cela fonctionnerait-il avec l'exemple indiqué dans la question initiale? (Types ActionResult)
Dan Esparza

Si vous avez un type qui dérive d'ActionResult, vous pouvez cliquer avec le bouton droit sur votre type et sélectionner Types de base, ce qui vous mènera à ActionResult, sur lequel vous pouvez maintenant cliquer avec le bouton droit de la souris et sélectionner Types dérivés. (Si vous n'avez aucun type qui dérive d'ActionResult, vous pouvez revenir à System.Object, puis à ActionResult.)
yoyo

21
Pour ceux d'entre vous qui, comme moi, ont fait un clic droit sur le fichier de code de la classe et ont été perplexes quant à la raison pour laquelle il n'y avait pas d'option de menu "types dérivés": rappelez-vous que vous devez d'abord développer l'élément de fichier de code pour révéler l'élément de classe - puis clic-droit.
BCA

3
J'utilise VS 2017. Malheureusement, cela ne montre que les classes qui existent dans le même assembly, cela ne montre pas la solution entière.
NightOwl888

4
Il est étrange de voir comment cette fonctionnalité existe dans l'Explorateur de solutions mais pas dans la vue de classe.
Dai

73

Vous n'avez pas nécessairement besoin de Reflector pour cela - la vue «Diagramme de classes» de Visual Studio vous permettra également de trouver facilement toutes les classes dérivées pour une classe particulière. Cliquez avec le bouton droit sur la classe dans "Vue de classe" et choisissez "Afficher le diagramme de classe". Si le diagramme n'indique pas le niveau de détail souhaité pour la hiérarchie, cliquez avec le bouton droit de la souris sur la case de la classe dans le diagramme et choisissez "Afficher les classes dérivées".

Ce n'est peut-être pas aussi direct que Resharper, mais c'est une option si vous n'avez pas déjà R #.

Malheureusement, je ne suis pas certain des versions particulières de Visual Studio.


15
Cela vous permettra uniquement d'afficher les classes de votre solution qui héritent / implémentent la classe / l'interface cible. Bon à savoir cependant.
Markus Jarderot

Connaissez-vous les limites de cette méthode? Parce que cela ne me permet pas de voir toutes les sous-classes (il semble que cela ne montre que les sous-classes qui n'implémentent aucune interface supplémentaire).
Serge

1
J'ai eu une erreur disant "Il n'y a pas de types qui dérivent de XXX dans le projet actuel", donc je pense que c'est limité aux types dans le projet actuel, pas à la solution
Andy

Puis-je exécuter "Afficher les classes dérivées" de manière récursive? Ou dois-je sélectionner "Afficher les classes dérivées" sur chaque sous-classe explicitement?
James Wierzba

15

C'est la réponse la moins paresseuse (je suis juste fier de cette réponse :)

Je n'ai pas ReSharper, je l'ai déjà essayé mais je ne voulais pas l'acheter. J'ai essayé un diagramme de classes mais ce n'est pas pratique du tout car le diagramme hiérarchique couvre le monde 3 fois et l'écran de mon ordinateur portable n'a pas une largeur infinie. Ma solution naturelle et simple a donc été d'écrire du code Windows Forms pour parcourir les types dans un assembly et d'utiliser la réflexion pour ajouter des nœuds à une arborescence, comme suit:

veuillez supposer que vous avez une zone de texte, une arborescence et d'autres éléments nécessaires sur un formulaire dans lequel ce code s'exécute

//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 pour un exemple de code sympa. Qu'en est-il des classes de base et des classes dérivées dans d'autres assemblys?
ToolmakerSteve

@ToolmakerSteve, qu'en est-il AppDomain.CurrentDomain.GetAssemblies()? Jetez un œil à ceci: stackoverflow.com/questions/851248/…
Mzn

14

À partir de 'Visual Studio 2015 Update 1', vous pouvez simplement cliquer avec le bouton droit de la souris sur un nom de classe dans l'éditeur de code de classe, puis sélectionner 'Aller à l'implémentation' dans le menu contextuel: avec Ctrl + F12 étant le raccourci.

Voir https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/ pour plus de détails.


1
J'apprécie le conseil, mais je ne suis pas sûr que cela réponde à mon cas d'utilisation d'origine de voir toutes les classes héritées d'une classe de base.
Dan Esparza

3
@DanEsparza: c'est le cas, du moins dans VS2017. J'ai donc voté pour la réponse
João Antunes

1
C'est bien. Malheureusement, ne montre pas l'arborescence de la hiérarchie ... Je répertorie tout simplement dans le même niveau d'arbre.
Lombas

Et comme toujours le nom est faux, complètement oublié lors de ma recherche / utilisation, j'ai dû venir sur StackOverflow pour le trouver!
dim8

10

Personne ne l'a encore mentionné, alors je vais l'ajouter.
Jetbrains dotPeek est un décompilateur .NET gratuit qui a le pouvoir d'afficher ces informations facilement.

Téléchargement gratuit: http://www.jetbrains.com/decompiler/

Jetbrains est la société qui fabrique Resharper.

Étapes pour trouver des classes dérivées:

  1. Démarrez dotPeek
  2. Sélectionnez 'Ouvrir à partir du GAC ...' et ajoutez l'assembly System.Web.MVC
  3. Sélectionnez "Naviguer / Aller pour taper" et tapez ActionResult
  4. Sur la ActionResultdéclaration de classe, cliquez avec le bouton droit de la souris et sélectionnez 'Symboles dérivés'
  5. Voila! Chaque classe dérivée est affichée (même quelques-unes que je ne connaissais pas!)

7

En supposant que Resharper est installé: avec le curseur sur la classe / interface, faites un clic droit - Inspecter - Hiérarchies

Cela montre les sous-classes, les implémentations et les superclasses.


Hmmm ... intéressant, mais pas ce que je cherchais. Si je clique avec le bouton droit sur un élément ActionResult retourné et que je suis ces étapes, j'obtiens les options 'Inspecter' pour 'Controller' (le type de la classe contenant). Si j'essaye d'accéder à la définition 'ViewResult', je suis dans les métadonnées et je n'ai pas la possibilité d'inspecter les hiérarchies.
Dan Esparza

1
Aussi: je suis assez certain que c'est une fonction fournie par Resharper, ce n'est pas nativement dans Visual Studio ...
Dan Esparza

7

Essayez Visual Studio Class View

Dans Visual Studio Class View, accédez à la classe qui vous intéresse et trouvez sa base et ses classes dérivées


3
C'est en fait une vue potentiellement utile. Malheureusement, il est incroyablement lent, ne lie / ne suit pas l'éditeur actuel et ressemble généralement à une réflexion après coup dans VS.
E-Riz du

Cela montre toutes les classes, pas seulement celles de votre solution et fonctionne dès la sortie de la boîte. Ce n'est pas lent. Pour une vue plus graphique, utilisez également la fonctionnalité intégrée de diagramme de classes (mais qui n'affiche que les classes dans votre solution). C'est tout ce dont j'aurais besoin et c'est la meilleure réponse.
Nikos

5

Vous pouvez également utiliser Reflector .

Chargez tous les assemblys dans lesquels vous souhaitez qu'il recherche, accédez à un type et développez l'élément Types dérivés.

Vous pouvez également le faire dans l'Explorateur d'objets, mais pour une raison quelconque, VS2008 ne peut le faire que dans l'une des vues .Net Framework. (VS2010 Beta 2 peut le faire dans n'importe quelle vue)


3
Reflector coûte désormais de l'argent, mais ILSpy fera de même gratuitement.
yoyo

Il existe un essai gratuit de 30 jours, mais aucune version gratuite ne peut être utilisée indéfiniment. À moins que vous ne sachiez quelque chose que je ne sais pas? Je viens de vérifier reflector.net .
yoyo

1
Désolé; Reflector avait toujours une édition gratuite. Quand s'en sont-ils débarrassés?
SLaks

2 février 2011 - zdnet.com/blog/burnette/…
yoyo

3
Ce qui était vraiment horrible, c'est qu'après cette date, si vous exécutiez une copie de la version gratuite que vous aviez précédemment téléchargée, redgate (ils ont acheté Reflector) SUPPRIMÉ l'ancienne version gratuite, la remplaçant par la version d'essai. Sans aucun avertissement. Et aucune option pour éviter la "mise à jour". C'est vrai: je n'étais pas allé sur le site Web de l'entreprise et je n'avais rien téléchargé d'eux. Mais il y avait une logique de licence dans l'ancien ReSharper qui leur était redirigé et leur permettait de désactiver la copie que j'avais. Je me suis juré de ne jamais, jamais, en aucune circonstance acheter quoi que ce soit à Redgate, ou autrement encourager leur existence.
ToolmakerSteve


4

Avec l'aide de ReSharper (version 2016.1.2) juste Ctrl+ Alt+ Clicksur la classe de base. Vous verrez quelque chose comme ceci:

voir les classes dérivées reSharper


1
+1 Bien! Il semble donc que les noms de classe qui apparaissent en gras dans la liste héritent directement de la classe de base sélectionnée, et les noms de classe dans la liste qui ne sont pas en gras héritent indirectement de la classe de base sélectionnée?
Simon Bosley

Exactement. Bald sera les classes qui héritent directement.
Devid


1

sélectionnez le type et faites un clic droit voir quelque chose --- afficher sur la carte de code --option sélectionnez-le générer le format d'image pour ceux qui héritent de ce type comme très belle image au format de fichier .dgml cela donne beaucoup plus d'informations sur le type


1

En tant qu'option pour ceux qui utilisent Visual Assist, vous pouvez également appuyer sur Maj + ALT + G (pendant que le curseur est sur le nom de la classe) pour faire apparaître le menu contextuel "Aller à Associé", et s'il existe des classes dérivées, vous obtiendrez un sous-menu pour cela, cela les répertorie tous et montre même les structures d'héritage parmi ces classes dérivées.


0

Codez-le simplement.

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
Malheureusement, cela ne vous indique que les types qui héritent directement d'une classe particulière, pas ceux qui héritent indirectement d'une classe. Pour cela, vous devrez probablement utiliser quelque chose comme ce que MZN a écrit.
user420667

Ou vous pouvez utiliser t.IsSubClassOf (targetclass).
user420667

0

si vous avez mis à niveau vers VS2012, vous pouvez utiliser le "Code Map".
Cliquez avec le bouton droit de la souris sur le type dont vous souhaitez afficher la hiérarchie d'héritage et choisissez "Ajouter à la carte de code". Ensuite, dans la vue de la carte de code, vous pouvez développer les nœuds et faire un clic droit pour choisir "Afficher les classes dérivées / de base". Malheureusement, cela ne fonctionne pas pour les classes fournies par .NET.


4
FYI à quiconque, cela ne s'applique qu'à VS2012 Ultimate avec la mise à jour 1 installée. Les utilisateurs Premium / Pro ne peuvent malheureusement pas créer ces cartes.
Sean Hanley

0

Pour Visual Studio 2012 ( sans ReSharper )

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur la classe (dont vous voulez voir les classes dérivées).
  2. Dans le diagramme de classes, faites un clic droit sur la classe et sélectionnez «Afficher les classes dérivées».

1
Encore une fois, pour autant que je sache, cela ne montrera que les classes dérivées que vous avez écrites. Comment cela fonctionnerait-il avec l'exemple indiqué dans la question initiale? (Types ActionResult)
Dan Esparza

0

Mise à jour 2020:

Vous pouvez utiliser les cartes de code de Visual Studio qui fonctionnent assez bien.

Il suffit de faire un clic droit sur la classe et à naviguer:
Code Map> Show Related Items on Code Map>Show All Derived Types

entrez la description de l'image ici

Remarque:

  • Cette fonctionnalité est disponible uniquement sur l'édition Entreprise de Visual Studio, et si vous ne l' avez pas , vous pouvez l'obtenir gratuitement en téléchargeant la version Enterprise Preview à partir d' ici .
  • Ou vous pouvez simplement demander à n'importe qui de votre équipe de partager la carte de code avec cette fonctionnalité s'ils ont cette édition.

PS Cela vaut vraiment la peine de conserver la version Enterprise (ou du moins la version Preview de celle-ci) sur votre machine, car elle dispose d'un tas d' outils vraiment utiles qui ne sont pas inclus dans les autres éditions.


1
Il semble que cela ne fonctionne que pour les types dont vous avez la source. Pas des choses comme ActionResult(l'exemple du PO)
Iain

-1

Une manière très simple de le faire est de rechercher : Classnamedans la fenêtre «Rechercher et remplacer» (CTRL + F) et d'utiliser l'option «Rechercher les options / Faire correspondre le mot entier». Vous ne trouverez que les classes héritées.


1
Cela ne fonctionne pas à chaque fois, considérez-leclass DDerived : IInterface, BBase
jirkamat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.