Visual Studio: ¿Cómo muestro todas las clases heredadas de una clase base?


139

En Visual Studio, ¿cómo muestro todas las clases heredadas de una clase base?

Por ejemplo , en ASP.NET MVC hay varios tipos de ' ActionResult ', y todos heredan / implementan la clase base ActionResult.

Parece que a menos que solo 'sepa' eso Viewy Jsonsean ActionResulttipos válidos , no hay forma de que pueda encontrar fácilmente esta información.

Por favor, demuéstrame que estoy equivocado.

¿Hay algo en el navegador de objetos que lo haga fácil de encontrar?

Incluso tengo sugerencias de herramientas fuera de Visual Studio para descubrir esta información sobre varias clases. Por ejemplo: ¿hay algo en Resharper que me ayude?


2
Con Visual C # 2010 Express busco la solución ": ActionResult". No es ideal, pero mejor que nada.
yoyo

2
Creo que malinterpretas mi pregunta. JsonResult (referencia aquí: msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx ) hereda de ActionResult. Hay varias otras clases que heredan de ActionResult. ¿Cuál es una manera fácil de ver todas las clases que heredan de ActionResult?
Dan Esparza

3
En este caso, el código que estoy usando no es un código que aparece directamente en mi solución. Son clases de framework MVC en otro ensamblado. Buscar ": ActionResult" no funcionará para ningún código que use de un ensamblado.
Dan Esparza

Respuestas:


50

Claro, Resharper puede hacer esto. Y mucho más.

Simplemente haga clic derecho en el nombre del tipo en cualquier lugar y elija "Ir al heredero" en el menú contextual. "Ir al heredero" también se puede aplicar al método para navegar a las anulaciones y las implementaciones de un método de interfaz. Para una interfaz, puede volver a llamar "Buscar usos avanzados", simplemente haga clic con el botón derecho) donde encontrará todas las extensiones e implementaciones. Para un tipo derivado de tipos. Y mi característica favorita: haga clic y mantenga presionado Control en cualquier tipo / método para navegar a su declaración.

Creo que es una herramienta imprescindible para los desarrolladores de .net.


En Resharper 9.2, en cualquier tipo de código fuente, haga clic en "Buscar uso avanzado", seleccione Buscar = "Derivado" y Alcance = "Soluciones y bibliotecas".
Por ejemplo, para encontrar todos los herederos (tanto en la biblioteca como en su código) de alguna clase base en una DLL incluida de cualquier proveedor, declare una variable en su código con esa clase base. Luego haga clic derecho en el nombre de la clase base que acaba de escribir.


66
Es una pena. Los desarrolladores de Java que usan el Eclipse gratuito tienen esta funcionalidad lista para usar. En mi Resharper + VS2015, veo "ir a Implementación" en lugar de "Ir al heredero".
Polo Norte

1
Pero esto no me da las clases en el medio, solo se va. CTRL + ALT + B daría la respuesta.
Polo Norte

2
Visual Studio 6 lo tenía en proyectos C ++ hace casi 20 años. El buscador de objetos y el diagrama de clases no proporcionan la misma capacidad de peso ligero para voltear árboles de herencia. Recientemente descubrí que Eclipse tiene una gran versión de esto, con Java al menos. Vamos, MS, llama por teléfono a uno de tus ex desarrolladores y pregunta qué fue lo que perdiste ... De acuerdo, requería que todos los proyectos tuvieran la opción de generar datos de exploración BSC después de la compilación, pero eso estaba bien. Era realmente.
Philip Beck

150

Para VS2012,

  1. Navega hasta el archivo en el explorador de soluciones
  2. Expande y selecciona tu clase
  3. Haga clic con el botón derecho en el elemento de la clase (no en el elemento del archivo) -> Tipos derivados

9
Esto supone el código fuente que escribió. ¿Cómo funcionaría esto con el ejemplo indicado en la pregunta original? (Tipos de ActionResult)
Dan Esparza

Si tiene algún tipo que se deriva de ActionResult, puede hacer clic con el botón derecho en su tipo y seleccionar Tipos base, que lo llevará a ActionResult, que ahora puede hacer clic con el botón derecho y seleccionar Tipos derivados. (Si no tiene ningún tipo que se derive de ActionResult, podría volver a System.Object y luego a ActionResult.)
yoyo

21
Para aquellos de ustedes que, como yo, hicieron clic con el botón derecho en el archivo de código de la clase y quedaron perplejos por qué no había una opción de menú de "tipos derivados": recuerden que primero deben expandir el elemento del archivo de código para revelar el elemento de la clase, luego botón derecho del ratón.
BCA

3
Estoy usando VS 2017. Desafortunadamente, esto solo muestra las clases que existen en el mismo ensamblado, no muestra la solución completa.
NightOwl888

44
Es extraño cómo existe esta funcionalidad en el Explorador de soluciones pero no en la Vista de clase.
Dai

73

No necesariamente necesita Reflector para esto: la vista "Diagrama de clase" de Visual Studio le permitirá encontrar fácilmente todas las clases derivadas para una clase en particular. Haga clic derecho en la clase en "Vista de clase" y elija "Ver diagrama de clase". Si el diagrama no muestra el nivel de detalle que desea para la jerarquía, haga clic derecho en el cuadro de la clase en el diagrama y elija "Mostrar clases derivadas".

Puede que no sea tan directo como Resharper, pero es una opción si aún no tienes R #.

Desafortunadamente, no estoy seguro de qué versiones particulares de Visual Studio lo tienen.


15
Esto solo le permitirá ver las clases dentro de su solución que heredan / implementan la clase / interfaz objetivo. Es bueno saberlo sin embargo.
Markus Jarderot

¿Conoces las limitaciones de este método? Debido a que no me permite ver todas las subclases (parece que solo muestra subclases que no implementan interfaces adicionales).
Serge

1
Recibí un error que decía "No hay tipos que se derivan de XXX en el proyecto actual", por lo que creo que se limita a los tipos en el proyecto actual, no la solución
Andy

¿Puedo realizar "Mostrar clases derivadas" de forma recursiva? ¿O tengo que seleccionar "Mostrar clases derivadas" en cada subclase explícitamente?
James Wierzba

15

Esta es la respuesta menos perezosa (estoy orgulloso de esta respuesta :)

No tengo ReSharper, lo probé antes pero no quería comprarlo. Probé un diagrama de clase pero no es práctico en absoluto porque el diagrama de jerarquía abarca el mundo 3 veces y la pantalla de mi computadora portátil no tiene un ancho infinito. Entonces, mi solución natural y fácil fue escribir un código de formularios Windows Forms para iterar sobre los tipos en un ensamblaje y usar la reflexión para agregar nodos a una vista de árbol, de la siguiente manera:

suponga que tiene un cuadro de texto, una vista de árbol y otras cosas necesarias en un formulario en el que se ejecuta este código

//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 para un ejemplo de código genial. ¿Qué pasa con las clases base y las clases derivadas en otros ensamblados?
ToolmakerSteve

@ToolmakerSteve, ¿qué tal AppDomain.CurrentDomain.GetAssemblies()? Eche un vistazo a esto: stackoverflow.com/questions/851248/…
Mzn

14

A partir de 'Visual Studio 2015 Update 1', simplemente puede hacer clic con el botón derecho en el nombre de una clase en el editor de código de clase y luego seleccionar 'Ir a implementación' en el menú contextual: con Ctrl + F12 como acceso directo.

Consulte https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/ para obtener más detalles.


1
Agradezco el consejo, pero no estoy seguro de que esto aborde mi caso de uso original de ver todas las clases heredadas de una clase base.
Dan Esparza

3
@DanEsparza: lo hace, al menos en VS2017. Así que voté por la respuesta
João Antunes, el

1
Es agradable. Desafortunadamente, no muestra el árbol de jerarquía ... Simplemente enumero todo en el mismo nivel de árbol.
Lombas

Y como siempre el nombre es falso, lo pasé por alto completamente durante mi búsqueda / uso, ¡tuve que ir a StackOverflow para encontrarlo!
dim8

10

Nadie ha mencionado esto todavía, así que lo agregaré.
Jetbrains dotPeek es un descompilador .NET gratuito que tiene el poder de mostrar esta información fácilmente.

Descarga gratuita: http://www.jetbrains.com/decompiler/

Jetbrains es la compañía que fabrica Resharper.

Pasos para encontrar clases derivadas:

  1. Poner en marcha dotPeek
  2. Seleccione 'Abrir desde GAC ...' y agregue el ensamblado System.Web.MVC
  3. Seleccione 'Navegar / Ir a escribir' y escriba ActionResult
  4. En la ActionResultdeclaración de clase, haga clic derecho y seleccione 'Símbolos derivados'
  5. Voila! Se muestran todas las clases derivadas (¡incluso algunas que no conocía!)

7

Asumiendo que tiene instalado Resharper : con el cursor en la clase / interfaz, haga clic derecho - Inspeccionar - Jerarquías

Esto muestra subclases, implementaciones y superclases.


Hmmm ... interesante, pero no es lo que estaba buscando. Si hago clic derecho en un elemento ActionResult devuelto y sigo estos pasos, obtengo las opciones 'Inspeccionar' para 'Controlador' (el tipo de la clase que lo contiene). Si trato de ir a la definición 'ViewResult', estoy en metadatos y no tengo la opción de inspeccionar jerarquías.
Dan Esparza

1
Además: estoy bastante seguro de que esta es una función proporcionada por Resharper, no es nativa en Visual Studio ...
Dan Esparza

7

Prueba Visual Studio Class View

En Visual Studio Class View navegue a la clase que le interesa y encuentre sus clases base y derivadas


3
Esta es en realidad una vista potencialmente útil. Lamentablemente, es increíblemente lento, no vincula / sigue al editor actual, y generalmente se siente como una ocurrencia tardía en VS.
E-Riz

Esto muestra todas las clases, no solo las de su solución y funciona directamente. No es lento Para una vista más gráfica, use la función integrada Diagrama de clase también (pero eso solo muestra las clases dentro de su solución). Esto es todo lo que necesitaría y esta es la mejor respuesta.
Nikos

5

También puedes usar Reflector .

Cargue todos los ensamblajes en los que desea que se vea, navegue hasta un tipo y expanda el elemento Tipos derivados.

También puede hacerlo en el Explorador de objetos, pero por alguna razón VS2008 solo puede hacerlo en una de las vistas de .Net Framework. (VS2010 Beta 2 puede hacerlo en cualquier vista)


3
Reflector ahora cuesta dinero, pero ILSpy hará lo mismo de forma gratuita.
yoyo

Hay una versión de prueba gratuita de 30 días, pero no hay una versión gratuita que pueda usar indefinidamente. ¿A menos que sepas algo que yo no? Acabo de revisar reflector.net .
yoyo

1
Lo siento; Reflector solía tener una edición gratuita. ¿Cuándo lo eliminaron?
Fugas

2 de febrero de 2011 - zdnet.com/blog/burnette/…
yoyo

3
Lo que fue realmente horrible, es que después de esa fecha, si ejecutó una copia de la versión gratuita que había descargado previamente, redgate (compraron Reflector) BORRÓ la versión gratuita anterior, reemplazándola por la versión de prueba. Sin ninguna advertencia Y no hay opción para evitar la "actualización". Así es: no había ido al sitio web de la compañía y había descargado nada de ellos. Pero había una lógica de licencia en el viejo ReSharper que fue redirigido a ellos, y les permitió desactivar la copia que tenía. Prometí nunca, nunca, bajo ninguna circunstancia comprar nada de redgate, o alentar su existencia.
ToolmakerSteve


4

Con la ayuda de ReSharper (versión 2016.1.2) solo Ctrl+ Alt+ Clicken la Clase Base. Verás algo como esto:

ver clases derivadas reSharper


1
+1 Nice! Entonces, ¿parece que los nombres de clase que aparecen en negrita en la lista se heredan directamente de la clase base seleccionada, y los nombres de clase en la lista que no están en negrita se heredan indirectamente de la clase base seleccionada?
Simon Bosley

Exactamente. Calvo será las clases que heredan directamente.
Devid


1

seleccione el tipo y haga clic con el botón derecho para ver algo --- mostrar en el mapa de código --opción seleccionarlo generar la imagen para aquellos que heredan este tipo de imagen tan bonita como el formato de archivo .dgml, da mucha más información sobre el tipo


1

Como opción para aquellos que usan Visual Assist, también puede presionar Shift + ALT + G (mientras el cursor está en el nombre de la clase) para que aparezca el menú contextual "Ir a relacionado", y si hay clases derivadas obtendrá un submenú para eso que los enumera a todos e incluso muestra estructuras de herencia entre esas clases derivadas.


0

Solo codifícalo.

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
Desafortunadamente, esto solo le dice los tipos que heredan directamente de una clase en particular, no los que heredan indirectamente de una clase. Para eso, probablemente tengas que usar algo como lo que escribió MZN.
user420667

O podría usar t.IsSubClassOf (targetclass).
user420667

0

si actualizó a VS2012, puede usar el "Mapa de códigos".
Haga clic derecho sobre el tipo del que desea ver la jerarquía de herencia y elija "Agregar al mapa de código". Luego, en la vista de mapa de código, puede expandir los nodos y hacer clic derecho para elegir "Mostrar clases derivadas / base". Lamentablemente, no funciona para las clases proporcionadas por .NET.


44
Para su información, esto solo se aplica a VS2012 Ultimate con la Actualización 1 instalada. La gente Premium / Pro no puede crear estos mapas, desafortunadamente.
Sean Hanley

0

Para Visual Studio 2012 ( sin ReSharper )

  1. En el Explorador de soluciones, haga clic con el botón derecho en la clase (cuyas clases derivadas desea ver).
  2. En el diagrama de clase, haga clic derecho en la clase y seleccione 'Mostrar clases derivadas'.

1
Nuevamente, hasta donde puedo decir, esto solo mostrará las clases derivadas que usted escribió. ¿Cómo funcionaría esto con el ejemplo indicado en la pregunta original? (Tipos de ActionResult)
Dan Esparza

0

Actualización 2020:

Puede usar los mapas de código de Visual Studio que funcionan bastante bien.

Simplemente haga clic derecho en la clase y vaya a:
Code Map> Show Related Items on Code Map>Show All Derived Types

ingrese la descripción de la imagen aquí

Nota:

  • Esta función solo está disponible en la edición Enterprise de Visual Studio, y si no la tiene , puede obtenerla de forma gratuita descargando la versión Enterprise Preview desde aquí .
  • O puede pedirle a cualquiera de su equipo que comparta el mapa de códigos con esta función si tienen esa edición.

PD: Realmente vale la pena mantener la versión Enterprise (o al menos la versión Preview) en su máquina, ya que tiene muchas herramientas realmente útiles que no están incluidas en las otras ediciones.


1
Parece que esto solo funciona para los tipos para los que tiene la fuente. No cosas como ActionResult(el ejemplo del OP)
Iain

-1

Una forma muy simple de hacer esto es buscar : Classnameen la ventana "Buscar y reemplazar" (CTRL + F) y usar la opción "Buscar opciones / Hacer coincidir palabra completa". Encontrará solo las clases heredadas.


1
Considere que esto no funciona todo el tiempoclass DDerived : IInterface, BBase
Jirkamat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.