Existe uma maneira de navegar para a implementação real do método atrás de uma interface?


182

No Visual Studio, quando você clica com o botão direito do mouse em uma chamada de método, você vai para a implementação desse método dentro de uma classe, exceto se você acessar esse método por meio de uma interface: nesse caso, você vai para o método da interface e não para a implementação real.

Existe uma maneira / dicas (atalho de tecla ou qualquer outra coisa) para acessar essa implementação real? Caso contrário, você estará preso para adicionar algum comentário apenas para lembrar onde você o implementou que realmente não é produtivo e propenso a erros!

Atualização: respostas interessantes, mas não estou realmente satisfeito, porque todas são complicadas. Vou dar um exemplo preciso:

IInterface iInterface = someObject;                        
iInterface.someMethod();

Na verdade, se o Visual Studio fosse um pouco inteligente ao olhar apenas uma linha acima da chamada do método, veria onde está o objeto real. E isso me pouparia um monte de pressionamentos de tecla e evitaria usar "encontrar todas as referências" e depois escanear as linhas com meus olhos cansados ​​para ver qual linha continha a correta :)


4
Como ele saberia qual implementação você queria ver? (I pode ver a hierarquia de tipo para encontrar todas as implementações conhecidas, mas que pode ser uma característica ReSharper ... Eu não tenho certeza.)
Jon Skeet

1
@ supercat: Você quer dizer durante a depuração?
Jon Skeet

2
O ReSharper o implementa, fornecendo uma lista de implementações para escolher de onde não pode detectar a específica. Bom recurso e sinto falta, pois o "Encontrar todas as referências" traz de volta muito!
Fenton

4
A primeira vez que vi Jon Skeet está dizendo "Não tenho certeza". para uma pergunta C # no SO.
Muthu Ganapathy Nathan

3
@MuthuGanapathyNathan Ele provavelmente estava tentando parecer humano pela primeira vez.
Vort3x

Respostas:


258

Eu faço o seguinte:

1) Clique com o botão direito do mouse no método e clique em "Exibir hierarquia de chamadas" (ou atalho Ctrl + K, Ctrl + T)

2) Expanda a pasta "Implementos x", que mostrará todas as implementações desse método. Clique em um para ir para lá.

Relativamente rápido e fácil. Irritantemente, embora não pareça haver um equivalente para a própria interface.


update : a partir da atualização 1 do Visual Studio 2015, clique com o botão direito do mouse em um método e selecione ir para implementação. Você também pode mapeá-lo para o atalho do teclado em Ferramentas> Opções> Ambiente> Teclado e procurar o comando Edit.GoToImplementation. O atalho padrão é Ctrl+F12. ( F12irá navegar para a interface).



Boa solução alternativa. Eu estou furando para que, quando eu não tenho ReSharper
Roman

5
Posso pular a etapa 1. Apenas "Exibir hierarquia de chamadas" (ou atalho Ctrl + K, Ctrl + T) diretamente de onde você está trabalhando e pular a interface todos juntos. Estou no VS 2013.
Tony L.

Existe alguma tecla de atalho para Pico da implementação? Eu tentei o ALT-CTRL-F12 sem sucesso. (Peak is ALT-F12)
Levi Fuller

47

Com o VS2013, é possível colocar o cursor sobre o método e usar Navegar para ... (CTRL +,), e ele exibirá todos os locais onde o nome está declarado. Não funciona bem se interfaces diferentes usam os mesmos nomes de métodos.

Com a Atualização 1 do VS2015 , agora existe um novo atalho chamado "Ir para implementação".


4
Você pode usar Alt + End se estiver usando o recarregador.
precisa saber é o seguinte

1
Não funcionou para mim. Estou usando o VS Express 2013 para Web.
Akira Yamamoto

Acho isso o mais simples, sem tirar as mãos do teclado. Obrigado Rolf
Jp Vinjamoori

1
Esta é a solução mais rápida possível.
mbudnik

@brechtvhb Você também pode definir isso seja Alt + End sem R # personalizando o atalho de teclado para o comando Edit.NavigateTo:)
demoncodemonkey

17

Criei uma extensão gratuita para o Visual Studio 2010 e o Visual Studio 2012 chamada Margem de Herança para fornecer esse recurso específico, além de fornecer uma indicação clara quando um método implementa um método de interface devido a uma correspondência de assinatura. Na versão atual, você pode clicar com o botão direito do mouse em qualquer glifo para obter um menu de itens para o qual navegar.

Margem de herança - Galeria do Visual Studio

Captura de tela
(fonte: microsoft.com )


3
O julgamento do novo afiador expirou no trabalho, tentou esta extensão e é demais! obrigado cara
Giorgio Minardi

15

Clique com o botão direito do mouse em "Localizar todas as referências".

Isso exibirá a linha de código de todos os locais onde o método é usado, incluindo a declaração da interface e as implementações do método da interface. Você pode clicar na linha para ir para o local do código.


Isso não dá a imlpementação.
Robaticus

1
@Robaticus, na verdade, ele faz. Não é a maneira mais conveniente, mas as implementações serão misturadas com todas as outras referências.
Rex M

Essa é a única coisa que eu faço agora, mas é cansativo, acima de tudo, como eu não tenho bons olhos :)
user310291

6
Uma alternativa para encontrar símbolos é a hierarquia de chamadas. Ele possui os métodos agrupados em uma estrutura de pastas: Chamadas para '...', Chamadas de '...' e Implementa '...'
Phil Carson

4
A tecla de atalho para "Localizar todas as referências" é Shift + F12.
IsmailS

8

Dependendo da versão do Visual Studio que você possui, direi condicionalmente "sim".

Atualmente, estou operando no Ultimate e não tenho outras versões para verificar isso. Dito isto, no Ultimate, você pode usar o Architecture Explorer para encontrar implementações. É um pouco mais envolvido do que o método do clique direito, mas aqui está como ele funciona.

  • Vá para View->Architecture Explorer(ou CTRL-W, N)
  • Clique em Modo de exibição de classe e encontre o espaço para nome que contém sua interface na lista que é aberta.
  • À direita da lista de namespace, há um botão vertical que diz Types. Clique aqui
  • Selecione Interfaces
  • Escolha sua interface da lista
  • Um botão vertical que Membersaparece aparecerá à direita. Clique nesse botão
  • Escolha Implemented by(abaixo Inbound Navigation) e isso fornecerá uma lista de implementações da sua interface.
  • Clicar duas vezes na implementação o levará à classe.

Tenho certeza de que o Architecture Explorer é apenas a edição Ultimate, mas isso funcionará.
Richard

Obrigado, muito bom. Eu me inscrevi, mas, nesse contexto, quero mudar rapidamente meu código.
precisa saber é o seguinte

6

No 2012 Ultimate, você pode pesquisar a interface no Solution Explorer. Clique com o botão direito do mouse na interface e escolha "Tipos Derivados", as classes implementadas serão mostradas no Solution Explorer. Não tenho certeza se funciona em expresso.


Não percebi isso. Obrigado. <br/> Agora, se houvesse apenas uma maneira de fazer com que o gerenciador de soluções abrisse sua árvore no arquivo exibido no momento, então não preciso primeiro abrir a dica de ferramenta do editor para obter o caminho do arquivo, de modo a derivar e navegar do gerenciador de soluções ao arquivo de origem, onde posso determinar a lista de implementados pela interface ... A navegação pelo código-fonte deve se tornar um recurso mais importante, eu acho.
George

- Acabei de descobrir o comando "Ctrl +], S", que expande a árvore do Solution Explorer para o documento de edição atual (sincronize com o documento ativo). O nó do arquivo resultante pode ser expandido para expor os tipos contidos que, por sua vez, podem ser clicados com o botão direito do mouse para acessar o menu de contexto que contém o comando 'Tipos Derivados'. Agradável.
George

2
@George, você também pode ter o Visual Studio SEMPRE acompanhar o atual arquivo aberto no explorador solução através de Ferramentas -> Opções -> Projetos e Soluções -> Geral -> "Track item ativo na solução explorador"
MajorRefactoring

O VS2012 Premium também possui esse recurso. No VS2015 Empresa, esta ' Tipos Derivados recurso' foi dividida para duas características ' Tipos Derivados ' e ' implementado pela ', ainda mais agradáveis :)
cateyes

6

O Visual Studio 2015 Update 1 (lançado em dezembro de 2015) agora adicionou um clique com o botão direito do mouse no recurso 'Ir para implementação' como padrão.


5

Para quem usa o Resharper, pressionar CTRL + F12 fará com que você vá diretamente para o método de classe!


4

Isso não é possível. O que você está descrevendo faria sentido apenas se a interface estivesse limitada a 1 implementação.

Considere este exemplo:

interface IWrite 
{ 
 void Write(); 
}
class A : IWrite { 
  public void Write() { Console.WriteLine("A"); } 
}
class B : IWrite { 
  public void Write() { Console.WriteLine("B"); } 
}
class X : IWrite { 
  private readonly string _x;
  public X(string x) {
    _x = x;
  } 
  public void Write() { Console.WriteLine(_x); } 
}

class UseIWrite()
{
  public void Use(IWrite iwrite) 
  {
     iwrite.Write();
  }
}

Se você usar a implementação de Write in UseIWrite, ela será levada à declaração da interface, porque nesse momento qualquer uma das implementações do IWrite poderia ser passada para o método.

Felizmente, algumas ferramentas, como por exemplo o ReSharper, oferecem a você todos os usos do método, para que você possa navegar facilmente até a implementação desejada.


1
… E se houver apenas uma implementação, o R # o levará direto para lá sem mais delongas.
Jay

1
Não é gratuito, mas o Visual Studio também não. Quanto vale o seu tempo? :)
Jim Arnold

3
Não é que eu não quero pagar, é no princípio: este é um recurso bastante básico senso comum, é shamefull você tem que pagar mais uma vez quando você já pagou por VS :)
user310291

3
@ user310291 Embora eu concorde com você, não comprar o produto que possui exatamente o recurso que você deseja para "punir" terceiros por não fornecê-lo imediatamente, está cortando o nariz para irritar seu rosto.
TarkaDaal

1
O compartilhador fornece isso sem precisar mostrar todos os usos. Você pode selecionar para qual implementação deseja ir.
Michael Joyce

4

O Visual Studio com atualização 1 agora implementa esse recurso! Basta clicar com o botão direito do mouse no membro e você verá "Ir para implementação" logo abaixo de "Ir para definição".


2

Confira esta nova extensão gratuita do Visual Studio 2013 - Implementator . Ele adiciona a opção "Ir para implementação" ao menu de contexto do editor do Visual Studio.

Não é tão confiável e rápido como o Resharper, mas funciona bem.


2

Você pode tentar o Ctrl + F12atalho. Isso levará você à implementação, da mesma forma que levará a métodos sem interface usando o F12. [Eu tentei no VS 2017, não tenho certeza sobre outras versões]


1
esse atalho funciona bem no vscode com texto datilografado.
Zuhair Taha

1

O Visual Studio pode apenas dizer onde é referenciado, mas isso pode ser muito grosseiro.

Existem outras ferramentas que podem lhe informar mais sobre a estrutura do seu aplicativo, incluindo qual classe implementa qual interface, qual método substitui qual outro método e assim por diante. Pessoalmente, prefiro usar o Understand For C / C ++.


1

Ir para a declaração abrirá o método da interface. Ir para a implementação levará você ou listará para você as classes que implementam o código para esse método de interface (não o próprio método de interface).

Atualizar

Como Jon Skeet apontou nos comentários (e eu perdi antes de responder), o recurso que descrevi pode ser um recurso do ReSharper ... não do Visual Studio.


0

Não. Isso não é possível, apesar da elaborada estrutura de código de memória mantida pelo VS, a navegação de código é bastante ... mesquinha.

Parece que a única alternativa é uma pesquisa global com "Localizar todas as referências" seguida de uma pesquisa manual da lista resultante para excluir declarações de valor digitado, conversões etc. ou o uso de outras ferramentas no VS que não sejam o editor de código. Tudo bastante complexo e decepcionante.

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.