Est-il possible de naviguer vers une implémentation réelle de la méthode derrière une interface?

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 n’utilisez pas l’implémentation.

Existe-t-il un moyen / des astuces (raccourci clavier ou autre) pour accéder à cette implémentation réelle? Sinon, vous êtes obligé d’append des commentaires pour vous rappeler où vous les avez implémentés, ce qui n’est vraiment pas productif et source d’erreurs!

Mise à jour: des réponses intéressantes mais je ne suis pas vraiment satisfait car tout est encombrant. Je vais donner un exemple précis:

IInterface iInterface = someObject; iInterface.someMethod(); 

En fait, si Visual Studio était juste un peu intelligent pour regarder une seule ligne au-dessus de l’appel de méthode, il verrait où se trouve le véritable object. Et cela me permettrait d’économiser beaucoup de frappes et d’éviter 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 🙂

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 l’un pour y aller.

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


update : depuis Visual Studio 2015 update 1, cliquez avec le bouton droit sur une méthode et sélectionnez Aller à l’implémentation. Vous pouvez également le mapper au raccourci clavier via Outils> Options> Environnement> Clavier et rechercher la commande Edit.GoToImplementation. Le raccourci par défaut est Ctrl+F12 . ( F12 naviguera vers l’interface).


Avec VS2013, vous pouvez placer le curseur sur la méthode et utiliser Naviguer vers … (CTRL +,) pour afficher 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 y a maintenant un nouveau raccourci appelé “Go To Implementation”.

J’ai créé une extension gratuite pour Visual Studio 2010 et Visual Studio 2012 appelée Inheritance Margin (Marge d’inheritance) pour fournir cette fonctionnalité spécifique, ainsi qu’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 contenant les éléments à parcourir.

Marge d’inheritance – Visual Studio Gallery

Capture d'écran

Cliquez avec le bouton droit de la souris sur “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.

Selon la version de Visual Studio que vous avez, je dirai conditionnellement “oui”.

Je travaille actuellement sur 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.

  • Allez dans View->Architecture Explorer (ou CTRL-W, N)
  • Cliquez sur Class View et recherchez l’espace de noms contenant 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électionnez les Interfaces
  • Choisissez votre interface dans la liste
  • Un bouton vertical indiquant que les Members apparaîtront alors à droite. Cliquez sur ce bouton
  • Choisissez Implemented by (sous Inbound Navigation ) et cela fournira une liste des implémentations de votre interface.
  • Double-cliquer sur l’implémentation vous amènera à la classe.

Dans 2012 Ultimate, vous pouvez rechercher l’interface dans l’explorateur de solutions. Cliquez-droit sur l’interface et choisissez “Types dérivés”, les classes implémentées seront affichées dans l’explorateur de solutions. Pas sûr si cela fonctionne dans express.

Visual Studio 2015 Update 1 (publié en décembre 2015) a désormais ajouté un clic droit sur la fonctionnalité “Go To Implementation” en standard.

Ce n’est pas possible. Ce que vous décrivez n’aurait de sens que si l’interface se limitait à 1 implémentation.

Considérez 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 ssortingng _x; public X(ssortingng x) { _x = x; } public void Write() { Console.WriteLine(_x); } } class UseIWrite() { public void Use(IWrite iwrite) { iwrite.Write(); } } 

Si vous utilisez go pour l’implémentation de Write dans UseIWrite, cela vous amène à la déclaration de l’interface, car à ce stade, toutes les implémentations IWrite pourraient être transmises à la méthode.

Heureusement, certains outils comme ReSharper, par exemple, vous permettent de trouver tous les usages de la méthode, ce qui vous permet de naviguer facilement vers l’implémentation souhaitée.

Pour ceux qui utilisent Resharper, appuyez sur CTRL + F12 pour accéder directement à la méthode de classe!

Découvrez cette nouvelle extension – implémenteur Visual Studio 2013 gratuite. 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 est-ce que cela fonctionne bien?

Visual Studio avec Update 1 implémente maintenant cette fonctionnalité! Cliquez avec le bouton droit sur le membre et vous devriez voir “Aller à l’implémentation” sous “Aller à la définition”.

Visual Studio ne peut que vous dire 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 la classe qui implémente quelle interface, quelle méthode remplace une autre méthode, etc. Personnellement, je préfère utiliser Understand For C / C ++.

Aller à la déclaration ouvrira la méthode de l’interface. Aller à l’implémentation, vous prendra, ou vous listera, 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 fait remarquer dans les commentaires (et que j’ai manqué de le faire avant de répondre), la fonctionnalité que j’ai décrite pourrait être une fonctionnalité ReSharper… pas une fonctionnalité Visual Studio.

Non, ce n’est pas possible, malgré la structure élaborée du code 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 “Find All Reference” suivie d’une recherche manuelle de la liste résultante pour exclure les déclarations de valeur typées, les conversions, etc. ou l’utilisation d’autres outils dans VS autres que l’éditeur de code. Tout plutôt complexe et décevant.