151 votes

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

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

Par exemple Dans ASP.NET MVC, il y a plusieurs ' ActionResult et ils héritent tous de la classe de base et l'implémentent. ActionResult .

On dirait qu'à moins que vous ne sachiez que View y Json sont valables ActionResult types, il n'y a aucun moyen de trouver facilement ces informations.

Prouvez-moi que j'ai tort.

Y a-t-il quelque chose dans le navigateur d'objets qui permet de le découvrir facilement ?

Je suis même ouvert aux suggestions d'outils en dehors de Visual Studio pour découvrir ces informations sur les différentes classes. Par exemple : y a-t-il quelque chose dans Resharper qui pourrait m'aider ?

2 votes

Avec Visual C# 2010 Express, je cherche la solution pour " : ActionResult". Ce n'est pas idéal, mais c'est mieux que rien.

2 votes

Je pense que vous comprenez mal ma question. JsonResult (référence ici : msdn.microsoft.com/fr/us/library/system.web.mvc.jsonresult.aspx ) hérite de ActionResult. Il existe plusieurs autres classes qui héritent de ActionResult. Quel est le moyen le plus simple de voir toutes les classes qui héritent de ActionResult ?

3 votes

Dans ce cas, le code que j'utilise n'est pas celui qui apparaît directement dans ma solution. Il s'agit de classes du framework MVC dans une autre assembly. La recherche de " : ActionResult" ne fonctionnera pas pour le code que j'utilise à partir d'une assembly.

165voto

user19192 Points 551

Pour VS2012,

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

11 votes

Cela suppose un code source que vous avez écrit. Comment cela fonctionnerait-il avec l'exemple énoncé dans la question initiale ? (types d'ActionResult)

1 votes

Si vous avez un type qui dérive de ActionResult, vous pouvez faire un clic droit sur votre type et sélectionner Base Types, ce qui vous amènera à ActionResult, sur lequel vous pouvez maintenant faire un clic droit et sélectionner Derived Types. (Si vous n'avez aucun type qui dérive de ActionResult, vous pouvez remonter jusqu'à System.Object, puis descendre jusqu'à ActionResult).

24 votes

Pour ceux d'entre vous qui, comme moi, ont cliqué avec le bouton droit de la souris sur le fichier de code de la classe et se sont demandés pourquoi 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 du fichier de code pour révéler l'élément de la classe - puis cliquer avec le bouton droit de la souris.

74voto

Michael Burr Points 181287

Vous n'avez pas nécessairement besoin de Reflector pour cela - la vue "Diagramme de classe" de Visual Studio vous permettra également de trouver facilement toutes les classes dérivées d'une classe particulière. Faites un clic droit sur la classe dans "Class View" et choisissez "View Class Diagram". Si le diagramme n'affiche pas le niveau de détail que vous souhaitez pour la hiérarchie, faites un clic droit sur la case de la classe dans le diagramme et choisissez "Afficher les classes dérivées".

Il 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 qui l'ont.

17 votes

Cela vous permettra de visualiser uniquement les classes de votre solution qui héritent/implémentent la classe/interface cible. Bon à savoir cependant.

0 votes

Connaissez-vous les limites de cette méthode ? Parce qu'elle ne me permet pas de voir toutes les sous-classes (il semble qu'elle ne montre que les sous-classes qui n'implémentent pas d'interfaces supplémentaires).

0 votes

Puis-je exécuter "Show derived classes" de manière récursive ? Ou dois-je sélectionner "Show derived classes" sur chaque sous-classe explicitement ?

47voto

Shrike Points 2594

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

Il suffit de faire un clic droit sur le nom du type à n'importe quel endroit et de choisir "Go To Inheritor" dans le menu contextuel. L'option "Go To Inheritor" peut également être appliquée à une méthode pour naviguer vers les surcharges et les implémentations d'une méthode d'interface. Pour une interface, vous pouvez appeler "Find Usages Advanced" (encore une fois, il suffit de faire un clic droit) pour trouver toutes les extensions et les implémentations. Pour un type - les types dérivés. Et ma fonction préférée - cliquer en maintenant le contrôle sur n'importe quel type/méthode pour naviguer vers sa déclaration.

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


Dans Resharper 9.2, sur n'importe quel type dans le code source, rt-cliquez sur "Find Usage Advanced", sélectionnez Find="Derived" et Scope="Solutions and Libraries".
Par exemple, pour trouver 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. Ensuite, faites un clic droit sur le nom de la classe de base que vous venez de taper.

7 votes

C'est une honte. Les développeurs Java qui utilisent le logiciel gratuit Eclipse disposent de cette fonctionnalité dès le départ. Dans mon Resharper + VS2015, je vois "go to Implementation" plutôt que "Go To Inheritor".

1 votes

Mais cela ne me donne pas les classes du milieu, seulement les feuilles. CTRL+ALT+B donnerait la réponse.

2 votes

Visual Studio 6 l'utilisait pour les projets C++ il y a près de 20 ans. Le navigateur d'objets et le diagramme de classes ne fournissent pas la même capacité légère à retourner les arbres d'héritage. J'ai récemment découvert qu'Eclipse dispose d'une excellente version de cette fonction, du moins pour Java. Allez MS, téléphonez à l'un de vos anciens développeurs et demandez-lui ce que vous aviez mais que vous avez perdu..... Je vous accorde qu'il fallait que tous les projets aient l'option de génération de données de navigation BSC après la compilation, mais c'était bien. C'était vraiment bien.

15voto

Mzn Points 1216

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 n'ai pas voulu l'acheter. J'ai essayé un diagramme de classes mais ce n'est pas pratique du tout car le diagramme de hiérarchie s'étend sur 3 fois le monde et l'écran de mon ordinateur portable n'a pas une largeur infinie. Donc ma solution naturelle et facile a été d'écrire du code Windows Forms pour itérer sur les types dans une assemblée et utiliser la réflexion pour ajouter des nœuds à une vue arborescente, comme suit :

supposez que vous avez une zone de texte, une vue arborescente et d'autres éléments nécessaires sur un formulaire dans lequel ce code est exécuté.

//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 votes

+1 pour un exemple de code sympa. Qu'en est-il des classes de base et des classes dérivées dans d'autres assemblages ?

0 votes

@ToolmakerSteve, que diriez-vous de AppDomain.CurrentDomain.GetAssemblies() ? Jetez un coup d'oeil à ça : stackoverflow.com/questions/851248/

4voto

Tom Juergens Points 1749

Pour les classes Framework, j'utilise la bibliothèque MSDN. La section Inheritance Hierarchy va dans les deux sens. Il est vrai qu'elle n'est pas d'une grande aide pour certaines bibliothèques tierces, cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X