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.