form - Visual Studio: ¿Cómo muestro todas las clases heredadas de una clase base?
windows form c++ vs 2015 (18)
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 simplemente ''sepa'' que View
y Json
son tipos válidos de ActionResult
, no hay forma de que pueda encontrar fácilmente esta información.
Por favor, demuéstrame que estoy mal
¿Hay algo en el navegador de objetos que hace que esto sea fácil de descubrir?
Incluso estoy interesado en sugerencias de herramientas externas a Visual Studio para descubrir esta información sobre varias clases. Por ejemplo: ¿hay algo en Resharper que me ayude?
A partir de ''Visual Studio 2015 Update 1'', puede simplemente hacer clic con el botón derecho en un nombre de clase en el editor de código de clase y luego seleccionar ''Ir a implementación'' desde el menú contextual: Ctrl + F12 es el 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.
Arrastre la clase o el espacio de nombres del Explorador de objetos al archivo Class Digram .
¿Cómo obtener un buen diagrama de clases para las clases incorporadas de .net?
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 llamar nuevamente a "Encontrar usos avanzados", simplemente haga clic con el botón derecho) donde encontrar todas las extensiones e implementaciones. Para un tipo - tipos derivados. Y mi función favorita: haga clic con la tecla Control presionada 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. A continuación, haga clic derecho en el nombre de la clase base que acaba de escribir.
Como una opción para aquellos que usan Visual Assist, también puedes presionar Shift + ALT + G (mientras que el cursor está en el nombre de la clase) para que aparezca el menú contextual "Goto Related" y si hay clases derivadas obtendrás un submenú para eso que los enumera a todos e incluso muestra estructuras de herencia entre esas clases derivadas.
Con la ayuda de ReSharper (versión 2016.1.2) solo presione Ctrl + Alt + clic en la clase base. Verás algo como esto:
Nadie ha mencionado esto todavía, así que lo agregaré.
Jetbrains dotPeek es un descompilador .NET gratuito que tiene la capacidad 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:
- Start up dotPeek
- Seleccione ''Abrir desde GAC ...'' y agregue el ensamblado System.Web.MVC
- Seleccione ''Navegar / Ir a tipo'' y escriba
ActionResult
- En la declaración de clase
ActionResult
, haga clic con el botón derecho y seleccione ''Símbolos derivados'' - Voila! Se muestran todas las clases derivadas (¡incluso algunas que no conocía!)
No necesita necesariamente Reflector para esto: la vista "Diagrama de clases" de Visual Studio le permitirá encontrar fácilmente todas las clases derivadas para una clase particular también. 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 con el botón derecho en la casilla de la clase en el diagrama y seleccione "Mostrar clases derivadas".
Puede que no sea tan directo como Resharper, pero es una opción si ya no tienes R #.
Lamentablemente, no estoy seguro de qué versiones particulares de Visual Studio lo tienen.
Para VS2012,
- Navegue al archivo en el explorador de soluciones
- Expande y selecciona tu clase
- Haga clic con el botón derecho en el elemento de la clase (no en el elemento del archivo) -> Tipos derivados
Para Visual Studio 2012 ( sin ReSharper )
- En Solution Explorer, haga clic derecho en la clase (cuyas clases derivadas desea ver).
- En el diagrama de clases, haga clic derecho en la clase y seleccione ''Mostrar clases derivadas''.
Para las clases de Framework, uso MSDN Library. La sección Jerarquía de herencia va en ambas direcciones. Aunque no es de mucha ayuda para algunas bibliotecas de fiestas 3d.
Si actualizaste a VS2012, puedes usar el "Mapa de códigos".
Haga clic con el botón derecho en el tipo del que desea ver la jerarquía de herencia y elija "Agregar al mapa de código". Luego, en la vista del mapa de códigos puede expandir los nodos y hacer clic con el botón derecho para elegir "Mostrar clases derivadas / base". Desafortunadamente no funciona para las clases provistas por .NET.
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);
}
Suponiendo que tiene Resharper instalado: con el cursor en la clase / interfaz, haga clic derecho - Inspeccionar - Jerarquías
Esto muestra subclases, implementaciones y superclases.
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 hacer esto en el Examinador 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)
Una forma muy sencilla de hacerlo es buscar : Classname
de : Classname
en la "Ventana Buscar y Reemplazar" (CTRL + F) y usar la opción "Buscar opciones / Coincidir palabra completa". Encontrará solo las clases heredadas.
seleccione el tipo y haga clic derecho a ver algo --- mostrar en el mapa de código --opción seleccionarlo generar la imagen formet para aquellos que heredan este tipo de imagen tan agradable como el formato de archivo .dgml da mucha más información sobre el tipo
Esta es la respuesta menos floja (estoy orgulloso de esta respuesta :)
No tengo ReSharper, lo probé antes pero no quería comprarlo. Probé un diagrama de clases, 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. Así que mi solución natural y fácil fue escribir algún código de Windows Forms para iterar sobre los tipos en un ensamblado y usar la reflexión para agregar nodos a una vista en á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 add them to a tree node or add a tree node or more to them as they might be parents or children of a class. if neither 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();