web-dev-qa-db-fra.com

Existe-t-il un moyen 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 accédez à la méthode d'interface et non à l'implémentation réelle.

Existe-t-il un moyen/astuce (raccourci clavier ou autre) pour accéder à cette implémentation réelle? Sinon, vous ne pouvez pas ajouter de commentaire pour vous rappeler où vous l'avez implémenté, ce 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 lourdes. 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 le véritable objet. Et cela me permettrait d'économiser beaucoup de frappes au clavier et d'éviter d'utiliser "trouver toutes les références" puis de numériser les lignes avec mes yeux fatigués pour voir quelle ligne contient la bonne. :)

160
user310291

Je fais ce qui suit:

1) Faites un clic droit sur la méthode et cliquez sur "Afficher la hiérarchie des appels" (ou le 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. De manière contrariante, il ne semble pas y avoir d’équivalent pour l’interface elle-même.


mise à jour: à partir de Visual Studio 2015 mise à jour 1, cliquez avec le bouton droit de la souris sur une méthode et sélectionnez Aller à la mise en oeuvre. Vous pouvez également le mapper sur un raccourci clavier via Outils> Options> Environnement> Clavier et rechercher la commande Edit.GoToImplementation. Le raccourci par défaut est Ctrl+F12. (F12 va accéder à l'interface).


242
MajorRefactoring

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éthodes.

Avec VS2015 Update 1 , un nouveau raccourci appelé "Aller à la mise en oeuvre" a été créé.

46
Rolf Kristensen

J'ai créé une extension gratuite pour Visual Studio 2010 et Visual Studio 2012 appelée Marge d'héritage afin de fournir cette fonctionnalité spécifique et d'indiquer clairement quand 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 de la souris sur n’importe quel glyphe pour afficher un menu contenant les éléments à parcourir.

Marge d'héritage - Galerie Visual Studio

Screenshot

16
Sam Harwell

Cliquez avec le bouton droit de la souris, puis sur "Trouver 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.

15
Phil Carson

En fonction de 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 Architecture Explorer pour rechercher 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 Affichage de la classe et recherchez l'espace de nom contenant votre interface dans la liste qui s'ouvre.
  • À la droite de la liste des espaces de noms, vous trouverez un bouton vertical indiquant Types. Cliquez ce
  • Sélectionnez Interfaces
  • Choisissez votre interface dans la liste
  • Un bouton vertical indiquant Members apparaîtra alors à droite. Cliquez sur ce bouton
  • Choisissez Implemented by (sous Inbound Navigation) et qui fournira une liste des implémentations de votre interface.
  • Double-cliquez sur l'implémentation pour accéder à la classe.
8
Robaticus

Dans 2012 Ultimate, vous pouvez rechercher l'interface dans la solution Explorer. 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.

6
Jack Liu Shurui

La mise à jour 1 de Visual Studio 2015 (publiée en décembre 2015) a désormais ajouté la fonctionnalité standard "Aller à la mise en œuvre".

5
PaulG

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

4
Maximc

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

Considérons 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 allez à implémentation de Write dans UseIWrite, cela vous mènera à la déclaration de l'interface, car à ce stade, n'importe laquelle des implémentations IWrite pourrait être transmise à la méthode.

Heureusement, certains outils, comme par exemple ReSharper, vous proposent de trouver toutes les utilisations de la méthode, de sorte que vous puissiez facilement naviguer vers la mise en oeuvre souhaitée.

4
m0sa

Visual Studio avec Update 1 implémente maintenant cette fonctionnalité! Faites un clic droit sur le membre et vous devriez voir "Aller à la mise en oeuvre" juste sous "Aller à la définition".

4
Jason Steele

Découvrez cette nouvelle extension gratuite de Visual Studio 2013 - Implementator . Il ajoute l'option "Aller à la mise en œuvre" dans le menu contextuel de l'éditeur Visual Studio.

Ce n'est pas aussi fiable et rapide que Resharper, mais son travail est parfait.

2
Yura

Visual Studio peut uniquement vous indiquer où il est référencé, mais cela risque d'ê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 redéfinit une autre méthode, etc. Personnellement, je préfère utiliser Understand For C/C++.

1
Patrick

Aller à la déclaration ouvrira la méthode d'interface. Aller à l'implémentation vous mè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).

Mise à jour

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

1
Jamie Dixon

Non, ce n’est pas possible, malgré la structure de code en mémoire complexe maintenue par VS, la navigation dans le code est plutôt ... radine.

Il semble que la seule alternative possible est 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 valeur typées, les conversions, etc. ou l'utilisation d'autres outils dans VS autres que l'éditeur de code. Tous assez complexes et décevants.

0
George

Tu peux essayer Ctrl + F12 raccourci. Cela vous mènera à l'implémentation tout comme cela vous mènera à des méthodes sans interface utilisant F12. [Je l'ai essayé dans VS 2017, pas sûr des autres versions]

0
Akbar Badhusha