Existe-t-il un moyen de naviguer vers une implémentation réelle de méthode derrière une interface?

182

Dans Visual Studio, lorsque vous cliquez avec le bouton droit sur un appel de méthode, vous accédez à l'implémentation de cette méthode dans une classe, sauf si vous accédez à cette méthode via une interface: dans ce cas, vous accédez à la méthode d'interface et non à l'implémentation réelle.

Existe-t-il un moyen / des astuces (raccourci clavier ou autre) pour accéder à cette implémentation réelle? Sinon, vous êtes obligé d'ajouter un commentaire juste pour vous rappeler où vous l'avez implémenté qui n'est vraiment pas productif et sujet aux erreurs!

Mise à jour: réponses intéressantes mais je ne suis pas vraiment satisfait car toutes sont encombrantes. Je vais donner un exemple précis:

IInterface iInterface = someObject;                        
iInterface.someMethod();

En fait, si Visual Studio était juste un peu intelligent pour regarder juste une ligne au-dessus de l'appel de méthode, il verrait où se trouve l'objet réel. Et cela me ferait économiser beaucoup de frappes au clavier et éviterait d'utiliser "trouver toutes les références" puis de scanner les lignes avec mes yeux fatigués pour voir quelle ligne contient la bonne :)

user310291
la source
4
Comment saurait-il quelle implémentation vous souhaitez voir? (Je peux afficher la hiérarchie des types pour trouver toutes les implémentations connues, mais cela peut être une fonctionnalité de ReSharper ... Je ne suis pas sûr.)
Jon Skeet
1
@supercat: Voulez-vous dire pendant le débogage?
Jon Skeet
2
ReSharper l'implémente en fournissant une liste d'implémentations à choisir parmi lesquelles il ne peut pas détecter la spécifique. Belle fonctionnalité et ça me manque car le "Find All References" en rapporte trop!
Fenton
4
Pour la première fois que j'en ai vu, Jon Skeet dit «Je ne suis pas sûr». pour une question C # dans SO.
Muthu Ganapathy Nathan
3
@MuthuGanapathyNathan Il essayait probablement de ressembler à un être humain pour une fois.
Vort3x

Réponses:

258

Je fais ce qui suit:

1) Faites un clic droit sur la méthode et cliquez sur "Afficher la hiérarchie des appels" (ou raccourci Ctrl + K, Ctrl + T)

2) Développez le dossier "Implements x" qui vous montrera ensuite toutes les implémentations de cette méthode. Cliquez sur un pour y aller.

Relativement rapide et facile. Malheureusement, il ne semble pas y avoir d'équivalent pour l'interface elle-même.


mise à jour : à partir de la mise à jour 1 de Visual Studio 2015, faites un clic droit sur une méthode et sélectionnez aller à l'implémentation. Vous pouvez également le mapper à un raccourci clavier via Outils> Options> Environnement> Clavier et rechercher la commande Edit.GoToImplementation. Le raccourci par défaut est Ctrl+F12. ( F12naviguera vers l'interface).


MajorRefactoring
la source
Bonne solution de contournement. Je m'en tiens à ça quand je n'ai pas Resharper
Roman
5
Je suis capable de sauter l'étape 1. Juste «Afficher la hiérarchie des appels» (ou raccourci Ctrl + K, Ctrl + T) à partir de l'endroit où vous travaillez et sauter l'interface tous ensemble. Je suis dans VS 2013.
Tony L.
Existe-t-il un raccourci clavier pour Peak l'implémentation? J'ai essayé ALT-CTRL-F12 sans succès. (Le pic est ALT-F12)
Levi Fuller
47

Avec VS2013, on peut placer le curseur sur la méthode et utiliser Naviguer vers ... (CTRL +,), et il affichera tous les emplacements où le nom est déclaré. Ne fonctionne pas bien si différentes interfaces utilisent les mêmes noms de méthode.

Avec VS2015 Update 1, il existe désormais un nouveau raccourci appelé "Aller à l'implémentation".

Rolf Kristensen
la source
4
Vous pouvez utiliser Alt + Fin si vous utilisez le resharper.
brechtvhb
1
Cela n'a pas fonctionné pour moi. J'utilise VS Express 2013 pour le Web.
Akira Yamamoto
Je trouve cela comme la solution la plus simple, sans quitter le clavier. Merci Rolf
Jp Vinjamoori
1
C'est la solution la plus rapide possible.
mbudnik le
@brechtvhb Vous pouvez également définir cela sur Alt + Fin sans R # en personnalisant le raccourci clavier pour la commande Edit.NavigateTo:)
demoncodemonkey
17

J'ai créé une extension gratuite pour Visual Studio 2010 et Visual Studio 2012 appelée Marge d'héritage pour fournir cette fonctionnalité spécifique, ainsi que pour donner une indication claire lorsqu'une méthode implémente une méthode d'interface en raison d'une correspondance de signature. Dans la version actuelle, vous pouvez cliquer avec le bouton droit sur n'importe quel glyphe pour obtenir un menu d'éléments vers lesquels naviguer.

Marge d'héritage - Visual Studio Gallery

Capture d'écran
(source: microsoft.com )

Sam Harwell
la source
3
L'essai du resharper a expiré au travail, j'ai essayé cette extension et ça tombe bien! merci mec
Giorgio Minardi
15

Faites un clic droit puis "Rechercher toutes les références".

Cela affichera la ligne de code pour tous les endroits où la méthode est utilisée, y compris la déclaration d'interface et les implémentations de la méthode d'interface. Vous pouvez ensuite cliquer sur la ligne pour accéder à l'emplacement du code.

Phil Carson
la source
Cela ne donne pas l'implémentation.
Robaticus
1
@Robaticus en fait, c'est le cas. Ce n'est pas le moyen le plus pratique, mais les implémentations seront mélangées avec toutes les autres références.
Rex M
C'est la seule chose que je fais pour le moment mais c'est fatiguant surtout car je n'ai pas de bons yeux :)
user310291
6
Une alternative à la recherche de symboles est la hiérarchie des appels. Il a les méthodes regroupées dans une structure de dossiers: Appels à '...', Appels de '...' et Implements '...'
Phil Carson
4
La touche de raccourci pour "Rechercher toutes les références" est Shift + F12.
IsmailS
8

En fonction de la version de Visual Studio dont vous disposez, je dirai conditionnellement «oui».

J'utilise actuellement Ultimate et je n'ai pas d'autres versions pour le vérifier. Cela dit, dans Ultimate, vous pouvez utiliser l'Explorateur d'architecture pour trouver des implémentations. C'est un peu plus compliqué que la méthode du clic droit, mais voici comment cela fonctionne.

  • Aller à View->Architecture Explorer(ou CTRL-W, N)
  • Cliquez sur Vue de classe et recherchez l'espace de noms qui contient votre interface dans la liste qui s'ouvre.
  • À droite de la liste des espaces de noms, se trouve un bouton vertical indiquant Types. Cliquez ici
  • Sélectionner Interfaces
  • Choisissez votre interface dans la liste
  • Un bouton vertical qui dit Membersapparaîtra alors à droite. Cliquez sur ce bouton
  • Choisissez Implemented by(sous Inbound Navigation) et cela fournira une liste d'implémentations de votre interface.
  • Un double-clic sur l'implémentation vous amènera à la classe.
Robaticus
la source
Je suis assez sûr qu'Architecture Explorer est uniquement l'édition Ultimate, mais cela fonctionnera.
Richard
Merci assez bien j'ai fait un pouce vers le haut, mais dans ce contexte, je veux être rapide pour changer mon code.
user310291
6

Dans 2012 Ultimate, vous pouvez rechercher l'interface dans l'explorateur de solutions. Cliquez avec le bouton droit sur l'interface et choisissez "Types dérivés", les classes implémentées seront affichées dans l'explorateur de solutions. Je ne sais pas si cela fonctionne en express.

Jack Liu Shurui
la source
Je n'ai pas remarqué cela. Merci. <br/> Maintenant, s'il n'y avait qu'un moyen pour que l'explorateur de solutions ouvre son arborescence vers le fichier actuellement affiché, je n'ai donc pas d'abord afficher l'info-bulle de l'éditeur pour obtenir le chemin du fichier afin de dériver puis naviguer via l'explorateur de solutions vers le fichier source, où je peux déterminer la liste des implémentés pour l'interface ... La navigation dans le code source devrait devenir une fonctionnalité plus importante, je pense.
George
- Je viens de découvrir la commande "Ctrl +], S" qui étend l'arborescence de l'explorateur de solutions au document d'édition courant (synchronisation avec le document actif). Le nœud de fichier résultant peut ensuite être développé pour exposer les types contenus qui à leur tour peuvent être cliqués avec le bouton droit pour accéder au menu contextuel contenant la commande «Types dérivés». Agréable.
George
2
@George, vous pouvez également avoir Visual Studio TOUJOURS suivre le fichier ouvert actuel dans l'explorateur de solutions via Outils -> Options -> Projets et solutions -> Général -> "Suivre l'élément actif dans l'explorateur de solutions"
MajorRefactoring
VS2012 Premium a également cette fonctionnalité. Dans VS2015 Enterprise, cette fonctionnalité `` Types dérivés '' a été divisée en deux fonctionnalités `` Types dérivés '' et `` Mis en œuvre par '', encore plus agréable :)
cateyes
6

Visual Studio 2015 Update 1 (publié en décembre 2015) a maintenant ajouté une fonctionnalité de clic droit `` Aller à l'implémentation '' en standard.

PaulG
la source
5

Pour les personnes qui utilisent Resharper, appuyer sur CTRL + F12 vous fera passer directement à la méthode de classe!

Maximc
la source
4

Ce n'est pas possible. Ce que vous décrivez n'aurait de sens que si l'interface était limitée à 1 implémentation.

Prenons cet exemple:

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();
  }
}

Si vous utilisez, passez à la mise en œuvre de Write dans UseIWrite, cela vous amène à la déclaration de l'interface, car à ce stade, n'importe laquelle des implémentations IWrite pourrait être passée dans la méthode.

Heureusement, certains outils comme par exemple ReSharper vous proposent de trouver toutes les utilisations de la méthode, afin que vous puissiez facilement naviguer vers l'implémentation souhaitée.

m0sa
la source
1
… Et s'il n'y a qu'une seule implémentation, R # vous y emmènera directement sans plus tarder.
Jay
1
Ce n'est pas gratuit, mais Visual Studio non plus. Combien vaut votre temps? :)
Jim Arnold
3
Ce n'est pas que je ne veux pas payer, c'est sur le principe: c'est une fonctionnalité de bon sens assez basique, c'est dommage que vous deviez payer une fois de plus quand vous avez déjà payé pour VS :)
user310291
3
@ user310291 Bien que je sois d'accord avec vous, ne pas acheter le produit qui fait exactement la fonction que vous voulez pour "punir" un tiers pour ne pas le fournir hors de la boîte, c'est vous couper le nez pour contrarier votre visage.
TarkaDaal
1
Resharper fournit cela sans avoir à afficher toutes les utilisations. Vous pouvez sélectionner l'implémentation vers laquelle vous souhaitez accéder.
Michael Joyce
4

Visual Studio avec la mise à jour 1 implémente désormais cette fonctionnalité! Faites un clic droit sur le membre et vous devriez voir "Aller à l'implémentation" juste sous "Aller à la définition".

Jason Steele
la source
2

Découvrez cette nouvelle extension gratuite Visual Studio 2013 - Implémentateur . Il ajoute l'option "Aller à l'implémentation" au menu contextuel de l'éditeur Visual Studio.

Ce n'est pas aussi fiable et rapide que Resharper, mais ça fonctionne très bien.

Yura
la source
2

Vous pouvez essayer le Ctrl + F12raccourci. Cela vous mènera à l'implémentation tout comme il vous conduira à des méthodes sans interface utilisant F12. [Je l'ai essayé dans VS 2017, je ne suis pas sûr des autres versions]

Akbar Badhusha
la source
1
ce raccourci fonctionne bien à vscode avec dactylographié.
Zuhair Taha
1

Visual Studio peut uniquement vous indiquer où il est référencé, mais cela peut être trop grossier.

Il existe d'autres outils qui peuvent vous en dire plus sur la structure de votre application, y compris quelle classe implémente quelle interface, quelle méthode remplace quelle autre méthode, etc. Personnellement, je préfère utiliser Comprendre pour C / C ++.

Patrick
la source
1

Aller à la déclaration ouvrira la méthode d'interface. Aller à l'implémentation, vous emmènera, ou listera pour vous, les classes qui implémentent le code pour cette méthode d'interface (pas la méthode d'interface elle-même).

Mettre à jour

Comme Jon Skeet l'a souligné dans les commentaires (et j'ai manqué avant de répondre), la fonctionnalité que j'ai décrite pourrait être une fonctionnalité de ReSharper ... pas une fonctionnalité de Visual Studio.

Jamie Dixon
la source
0

Non. Ce n'est pas possible, malgré la structure de code élaborée en mémoire maintenue par VS, la navigation dans le code est plutôt ... avare.

Il semble que la seule alternative soit une recherche globale avec "Rechercher toutes les références" suivie d'une recherche manuelle dans la liste résultante pour exclure les déclarations de valeurs saisies, les conversions, etc. ou l'utilisation d'autres outils dans VS autres que l'éditeur de code. Tout cela est plutôt complexe et décevant.

George
la source