Visual Studio: Como mostro todas as classes herdadas de uma classe base?


139

No Visual Studio, como mostro todas as classes herdadas de uma classe base?

Por exemplo , no ASP.NET MVC, existem vários tipos de ' ActionResult ' - e todos eles herdam / implementam a classe base ActionResult.

Parece que, a menos que você "saiba" isso Viewe Jsonsão ActionResulttipos válidos , não há como descobrir facilmente essas informações.

Por favor, prove que estou errado.

Existe algo no navegador de objetos que facilita a descoberta?

Estou pronto para sugestões de ferramentas fora do Visual Studio para descobrir essas informações sobre várias classes. Por exemplo: existe algo no Resharper que me ajudará?


2
Com o Visual C # 2010 Express, procuro a solução para ": ActionResult". Não é o ideal, mas é melhor que nada.
— yoyo

2
Eu acho que você não entendeu minha pergunta. O JsonResult (referência aqui: msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx ) herda do ActionResult. Existem várias outras classes que herdam do ActionResult. Qual é uma maneira fácil de ver todas as classes que herdam do ActionResult?
— 21712 Dan Esparza

3
Nesse caso, o código que estou usando não é o código que aparece diretamente na minha solução. Eles são classes de estrutura MVC em outro assembly. Procurar ": ActionResult" não funcionará para nenhum código que eu use de um assembly.
— 21712 Dan Esparza

Respostas:


50

Claro, o Resharper pode fazer isso. E muito mais.

Apenas clique com o botão direito do mouse no nome do tipo em qualquer lugar e escolha "Ir para o herdador" no menu de contexto. "Go To Inheritor" também pode ser aplicado ao método de navegação para substituições e às implementações de um método de interface. Para uma interface, você pode chamar "Encontrar usos avançados" novamente, apenas clicar com o botão direito do mouse) onde encontrar todas as extensões e implementações. Para um tipo derivado de tipo. E meu recurso favorito - clique mantendo pressionada a tecla Control em qualquer tipo / método para navegar até sua declaração.

Eu acho que é uma ferramenta indispensável para desenvolvedores .net.


No Resharper 9.2, em qualquer tipo de código-fonte, clique com a tecla rt em "Localizar Uso Avançado", selecione Localizar = "Derivado" e Escopo = "Soluções e Bibliotecas".
Por exemplo, para localizar todos os herdeiros (na biblioteca e no seu código) de alguma classe base em uma DLL incluída de qualquer fornecedor, declare uma variável no seu código com essa classe base. Em seguida, clique com o botão direito do mouse no nome da classe base que você acabou de digitar.


6
Que vergonha. Os desenvolvedores Java que usam o Eclipse gratuito, têm essa funcionalidade pronta para uso. No meu Resharper + VS2015, vejo "ir para Implementação" em vez de "Ir para Inheritor".
— Pólo Norte

1
Mas isso não me dá as aulas no meio, apenas sai. CTRL + ALT + B daria a resposta.
— Pólo Norte

2
O Visual Studio 6 o utilizou em projetos C ++ há quase 20 anos. O navegador de objetos e o diagrama de classes não oferecem a mesma capacidade leve de inverter árvores de herança. Recentemente, descobri que o Eclipse tem uma ótima versão disso, pelo menos com Java. Vamos lá, MS, ligue para um de seus ex-desenvolvedores e pergunte o que você perdeu, mas ... Concedido que todos os projetos tinham a opção de gerar dados de navegação BSC após a compilação, mas tudo bem. Foi mesmo.
— Philip Beck

150

Para o VS2012,

  1. Navegue para o arquivo no Solution Explorer
  2. Expanda e selecione sua turma
  3. Clique com o botão direito do mouse no item da classe (não no item do arquivo) -> Tipos Derivados

9
Isso pressupõe o código fonte que você escreveu. Como isso funcionaria com o exemplo indicado na pergunta original? (Tipos de ActionResult)
— Dan Esparza

Se você tiver algum tipo derivado do ActionResult, poderá clicar com o botão direito do mouse no seu tipo e selecionar Tipos de Base, que o levará ao ActionResult, no qual agora você pode clicar com o botão direito do mouse e selecionar Tipos Derivados. (Se você não tem nenhum tipo que deriva de ActionResult então você pode trabalhar o seu caminho de volta para System.Object e, em seguida, para baixo para ActionResult.)
— yoyo

21
Para aqueles de vocês que, como eu, clicaram com o botão direito do mouse no arquivo de código da turma e ficaram surpresos com o motivo pelo qual não havia opção de menu "tipos derivados": lembre-se de que você deve primeiro expandir o item do arquivo de código para revelar o item da classe - depois clique com o botão direito.
— BCA

3
Estou usando o VS 2017. Infelizmente, isso mostra apenas as classes que existem no mesmo assembly, não mostra a solução inteira.
— NightOwl888

4
É estranho como essa funcionalidade existe no Solution Explorer, mas não no Modo de Exibição de Classe.
— Dai

73

Você não precisa necessariamente do Reflector para isso - a exibição "Diagrama de classe" do Visual Studio também permitirá que você encontre facilmente todas as classes derivadas de uma classe específica. Clique com o botão direito do mouse na turma em "Class View" e escolha "View Class Diagram". Se o diagrama não mostrar o nível de detalhe que você deseja para a hierarquia, clique com o botão direito do mouse na caixa da classe no diagrama e escolha "Mostrar Classes Derivadas".

Pode não ser tão direto quanto o Resharper, mas é uma opção se você ainda não possui o R #.

Infelizmente, não tenho certeza de quais versões específicas do Visual Studio o possuem.


15
Isso permitirá que você visualize apenas as classes em sua solução que herdam / implementam a classe / interface de destino. É bom saber embora.
— Markus Jarderot

Você conhece as limitações desse método? Porque não me permite ver todas as subclasses (parece que apenas mostra subclasses que não implementam nenhuma interface adicional).
— Serge

1
Eu tenho um erro dizendo "Não há tipos que derivam de XXX no projeto atual", então eu acho que ele é limitado aos tipos no projeto atual, não é a solução
— Andy

Posso executar "Mostrar classes derivadas" recursivamente? Ou tenho que selecionar "Mostrar classes derivadas" explicitamente em todas as subclasses?
— James Wierzba

15

Esta é a resposta menos preguiçosa (só me orgulho desta resposta :)

Não tenho ReSharper, tentei antes, mas não queria comprá-lo. Eu tentei um diagrama de classes, mas não é prático, porque o diagrama da hierarquia abrange o mundo três vezes e a tela do meu laptop não tem largura infinita. Portanto, minha solução natural e fácil foi escrever um código do Windows Forms para iterar os tipos em uma montagem e usar a reflexão para adicionar nós a uma exibição em árvore, da seguinte maneira:

suponha que você tenha uma caixa de texto, uma exibição em árvore e outras coisas necessárias em um formulário no qual esse código é executado

//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 um exemplo legal de código. E as classes base e classes derivadas em outros assemblies?
— Página Inicial>

@ToolmakerSteve, que tal AppDomain.CurrentDomain.GetAssemblies()? Dê uma olhada no seguinte: stackoverflow.com/questions/851248/…
— Mzn 28/02/19

14

A partir do 'Visual Studio 2015 Update 1', você pode simplesmente clicar com o botão direito do mouse no nome de uma classe no editor de código de classe e selecionar 'Ir para implementação "no menu de contexto: com Ctrl + F12 como atalho.

Consulte https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/ para obter mais detalhes.


1
Agradeço a dica, mas não tenho certeza se isso aborda meu caso de uso original de ver todas as classes herdadas de uma classe base.
— Dan Esparza

3
@ DanEsparza: sim, pelo menos no VS2017. Por isso, votei na resposta mais positiva
— João Antunes

1
É legal. Infelizmente, não mostra a árvore da hierarquia ... apenas liste tudo no mesmo nível de árvore.
— Lombas

E como sempre o nome é falso, completamente esquecido durante a minha pesquisa / uso, tive que vir ao StackOverflow para encontrá-lo!
— dim8 18/02

10

Ninguém mencionou isso ainda, então eu vou adicioná-lo.
O Jetbrains dotPeek é um descompilador .NET gratuito que pode mostrar essas informações facilmente.

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

Jetbrains é a empresa que fabrica o Resharper.

Etapas para encontrar classes derivadas:

  1. Inicie o dotPeek
  2. Selecione 'Abrir no GAC ...' e adicione o assembly System.Web.MVC
  3. Selecione 'Navegar / Ir para digitar' e digite ActionResult
  4. Na ActionResultdeclaração de classe, clique com o botão direito do mouse e selecione 'Símbolos derivados'
  5. Voila! Cada classe derivada é exibida (mesmo algumas que eu não conhecia!)

7

Supondo que você tenha o Resharper instalado: com o cursor na classe / interface, clique com o botão direito do mouse - Inspecionar - Hierarquias

Isso mostra subclasses, implementações e superclasses.


Hummm ... interessante, mas não o que eu estava procurando. Se clicar com o botão direito do mouse em um item retornado do ActionResult e seguir estas etapas, recebo as opções 'Inspecionar' para 'Controlador' (o tipo da classe que contém). Se eu tentar ir para a definição 'ViewResult', estou em metadados e não tenho a opção de Inspecionar hierarquias.
— Dan Esparza

1
Também: Estou bastante certo esta é uma função fornecida pelo ReSharper, não é nativamente no Visual Studio ...
— Dan Esparza

7

Experimente o modo de exibição de classe do Visual Studio

No Visual Studio Class View, navegue para a classe que você está interessado e encontre suas classes base e derivada


3
Esta é realmente uma visão potencialmente útil. Infelizmente, é incrivelmente lento, não vincula / segue o editor atual e geralmente parece uma reflexão tardia no VS.
— E-Riz

Isso mostra todas as classes, não apenas as da sua solução e funciona imediatamente. Não é lento. Para uma visualização mais gráfica, use também o recurso interno Diagrama de Classes (mas isso só exibe classes na sua solução). Isso é tudo que eu precisaria e esta é a melhor resposta.
— Nikos

5

Você também pode usar o Refletor .

Carregue todos os conjuntos que deseja que ele procure, navegue para um tipo e expanda o item Tipos Derivados.

Você também pode fazer isso no Pesquisador de objetos, mas por algum motivo o VS2008 pode fazê-lo apenas em uma das visualizações do .Net Framework. (O VS2010 Beta 2 pode fazê-lo em qualquer vista)


3
O Reflector agora custa dinheiro, mas o ILSpy fará o mesmo gratuitamente.
— yoyo

Há uma avaliação gratuita de 30 dias, mas nenhuma versão gratuita pode ser usada indefinidamente. A menos que você saiba algo que eu não sei? Acabei de verificar reflector.net .
— yoyo

1
Desculpe; O Reflector ainda tinha uma edição gratuita. Quando eles se livraram disso?
— SLaks

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

3
O que foi realmente horrível é que, após essa data, se você executou uma cópia da versão gratuita baixada anteriormente, o redgate (eles compraram o Reflector) EXCLUIU a versão gratuita antiga, substituindo-a pelo teste. Sem nenhum aviso. E nenhuma opção para evitar a "atualização". É isso mesmo: eu não tinha ido ao site da empresa e baixado nada deles. Mas havia uma lógica de licenciamento no ReSharper antigo que foi redirecionada para eles e permitiu que eles desativassem a cópia que eu tinha. Jurei nunca, jamais, em hipótese alguma, comprar qualquer coisa da redgate ou encorajar sua existência.
— Página Inicial>


4

Com a ajuda do ReSharper (versão 2016.1.2), basta Ctrl+ Alt+ Clickna classe base. Você verá algo assim:

veja classes derivadas reSharper


1
+1 Bom! Portanto, parece que os nomes de classe que aparecem em negrito na lista são herdados diretamente da classe base selecionada e os nomes de classe na lista que não estão em negrito são indiretamente herdados da classe base selecionada?
— precisa

Exatamente. Bald estará nas classes herdadas diretamente.
— Devid


1

selecione o tipo e clique com o botão direito do mouse para ver algo --- mostrar no mapa de código - opção selecione gerar o formato da imagem para aqueles que herdam esse tipo de imagem tão bonita quanto o formato de arquivo .dgml, fornece muito mais informações sobre o tipo


1

Como opção para aqueles que usam o Visual Assist, você também pode pressionar Shift + ALT + G (enquanto o cursor estiver no nome da classe) para abrir o menu de contexto "Ir para Relacionado" e, se houver classes derivadas, você obterá um submenu por isso, que lista todos eles e até mostra estruturas de herança entre essas classes derivadas.


0

Apenas codifique.

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
Infelizmente, isso informa apenas os tipos que herdam diretamente de uma classe específica, e não os que são herdados indiretamente de uma classe. Para isso, você provavelmente teria que usar algo parecido com o que MZN escreveu.
— User420667

Ou você pode usar t.IsSubClassOf (targetclass).
— user420667

0

se você atualizou para o VS2012, pode usar o "Mapa de Código".
Clique com o botão direito do mouse no tipo que você deseja visualizar na hierarquia de herança e escolha "Adicionar ao mapa de código". Em seguida, na visualização do mapa de código, você pode expandir os nós e clicar com o botão direito do mouse para escolher "Mostrar classes derivadas / base". Infelizmente, ele não funciona para as classes fornecidas pelo .NET.


4
Para sua informação pessoal, isso só se aplica ao VS2012 Ultimate com a Atualização 1 instalada. Infelizmente, o pessoal do Premium / Pro não pode criar esses mapas.
— quer

0

Para Visual Studio 2012 ( sem ReSharper )

  1. No Gerenciador de Soluções, clique com o botão direito do mouse na classe (cujas classes derivadas você deseja ver).
  2. No diagrama de classes, clique com o botão direito do mouse na classe e selecione 'Mostrar classes derivadas'.

1
Novamente, até onde sei, isso mostrará apenas as classes derivadas que você escreveu. Como isso funcionaria com o exemplo indicado na pergunta original? (Tipos de ActionResult)
— Dan Esparza

0

Atualização 2020:

Você pode usar o Code Maps do Visual Studio, que funciona muito bem.

Simplesmente clique direito sobre a classe e navegue até:
Code Map> Show Related Items on Code Map>Show All Derived Types

insira a descrição da imagem aqui

Nota:

  • Esse recurso está disponível apenas na edição Enterprise do Visual Studio e, se você não tiver , poderá obtê-lo gratuitamente fazendo o download da versão Enterprise Preview aqui .
  • Ou você pode simplesmente pedir a alguém da sua equipe que compartilhe o mapa de códigos com esse recurso se tiver essa edição.

PS: Vale a pena manter a versão Enterprise (ou pelo menos a versão Preview) em sua máquina, pois possui várias ferramentas realmente úteis que não estão incluídas nas outras edições.


1
Parece que isso funciona apenas para os tipos para os quais você tem a fonte. Não é como ActionResult(o exemplo do OP)
— Iain

-1

Uma maneira muito simples de fazer isso é procurar : Classnamena "Localizar e Substituir Janela" (CTRL + F) e usar a opção "Encontrar Opções / Corresponder à Palavra Inteira". Você encontrará apenas as classes herdadas.


1
Isso não funciona o tempo todo, considerarclass DDerived : IInterface, BBase
— jirkamat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.