¿Hay alguna manera de navegar a la implementación real del método detrás de una interfaz?

182

En Visual Studio, cuando hace clic con el botón derecho en una llamada a un método, va a la implementación de ese método dentro de una clase, excepto si accede a este método a través de una interfaz: en ese caso, va al método de la interfaz, no a la implementación real.

¿Hay alguna forma / consejos (atajo de teclado o algo) para acceder a esta implementación real? De lo contrario, está obligado a agregar algún comentario solo para recordar dónde lo implementó, lo que realmente no es productivo y propenso a errores.

Actualización: respuestas interesantes pero no estoy realmente satisfecho porque todos son engorrosos. Daré un ejemplo preciso:

IInterface iInterface = someObject;                        
iInterface.someMethod();

En realidad, si Visual Studio fuera un poco inteligente para mirar solo una línea por encima de la llamada al método, vería dónde está el objeto real. Y eso me ahorraría muchas pulsaciones de teclas y evitaría usar "buscar todas las referencias" y luego escanear las líneas con mis ojos cansados ​​para ver qué línea contiene la correcta :)

usuario310291
fuente
44
¿Cómo sabría qué implementación desea ver? (Puedo ver la jerarquía de tipos para encontrar todas las implementaciones conocidas, pero esa puede ser una característica de ReSharper ... No estoy seguro.)
Jon Skeet
1
@supercat: ¿Te refieres a la hora de depurar?
Jon Skeet
2
ReSharper lo implementa al proporcionar una lista de implementaciones para elegir donde no puede detectar la específica. ¡Bonita función y la extraño porque el "Buscar todas las referencias" me trae demasiado!
Fenton
44
La primera vez que he visto, Jon Skeet dice "No estoy seguro". para una pregunta de C # en SO.
Muthu Ganapathy Nathan
3
@MuthuGanapathyNathan Probablemente estaba tratando de parecer humano por una vez.
Vort3x

Respuestas:

258

Hago lo siguiente:

1) Haga clic derecho en el método y haga clic en "Ver jerarquía de llamadas" (o acceso directo Ctrl + K, Ctrl + T)

2) Expanda la carpeta "Implements x" que luego le mostrará todas las implementaciones de ese método. Haga clic en uno para ir allí.

Relativamente rápido y fácil. Aunque sea molesto, no parece haber un equivalente para la interfaz en sí.


actualización : a partir de la actualización 1 de Visual Studio 2015, haga clic derecho en un método y seleccione ir a implementación. También puede asignarlo al método abreviado de teclado mediante Herramientas> Opciones> Entorno> Teclado y buscar el comando Editar. Ir a Implementación. El acceso directo predeterminado es Ctrl+F12. ( F12navegará a la interfaz).


Refactorización Mayor
fuente
Buena solución Me apego a eso cuando no tengo Resharper
Roman
55
Puedo omitir el paso 1. Simplemente "Ver jerarquía de llamadas" (o atajo Ctrl + K, Ctrl + T) directamente desde donde está trabajando y omitir la interfaz por completo. Estoy en VS 2013.
Tony L.
¿Hay alguna tecla de acceso rápido para Peak la implementación? Intenté ALT-CTRL-F12 sin éxito. (Peak es ALT-F12)
Levi Fuller
47

Con VS2013, se puede colocar el cursor sobre el método y usar Navegar hacia ... (CTRL +,), y mostrará todas las ubicaciones donde se declara el nombre. No funciona bien si diferentes interfaces usan los mismos nombres de métodos.

Con VS2015 Update 1 ahora hay un nuevo acceso directo llamado "Ir a la implementación".

Rolf Kristensen
fuente
44
Puede usar Alt + End si está usando resharper.
brechtvhb
1
No funciono para mi. Estoy usando VS Express 2013 para la web.
Akira Yamamoto
Encuentro esto como la solución más simple, sin quitar las manos del teclado. Gracias Rolf
Jp Vinjamoori
1
Esta es la solución más rápida posible.
mbudnik
@brechtvhb También puede configurar esto para que sea Alt + End sin R # personalizando el método abreviado de teclado para el comando Edit.NavigateTo:)
demoncodemonkey
17

Creé una extensión gratuita para Visual Studio 2010 y Visual Studio 2012 llamada Margen de herencia para proporcionar esta característica específica, así como dar una indicación clara cuando un método implementa un método de interfaz debido a una coincidencia de firma. En la versión actual, puede hacer clic derecho en cualquier glifo para obtener un menú de elementos para navegar.

Margen de herencia - Visual Studio Gallery

Captura de pantalla
(fuente: microsoft.com )

Sam Harwell
fuente
3
La prueba de resharper ha expirado en el trabajo, probé esta extensión y es genial. gracias amigo
Giorgio Minardi
15

Haga clic derecho y luego "Buscar todas las referencias".

Esto mostrará la línea de código para todos los lugares donde se usa el método, incluida la declaración de interfaz y las implementaciones del método de interfaz. Luego puede hacer clic en la línea para saltar a la ubicación del código.

Phil Carson
fuente
Esto no da la imlpementación.
Robaticus
1
@Robaticus en realidad, lo hace. No es la forma más conveniente, pero las implementaciones se mezclarán con todas las demás referencias.
Rex M
Eso es lo único que hago en este momento, pero es agotador sobre todo porque no tengo buenos ojos :)
user310291
66
Una alternativa para encontrar símbolos es la jerarquía de llamadas. Tiene los métodos agrupados en una estructura de carpetas: Llamadas a '...', Llamadas desde '...' e Implementos '...'
Phil Carson
44
La tecla de acceso directo para "Buscar todas las referencias" es Shift + F12.
IsmailS
8

Dependiendo de la versión de Visual Studio que tenga, diré condicionalmente "sí".

Actualmente estoy operando en Ultimate, y no tengo otras versiones para verificar esto. Dicho esto, dentro de Ultimate, puedes usar el Explorador de Arquitectura para encontrar implementaciones. Es un poco más complicado que el método de clic derecho, pero así es como funciona.

  • Ir a View->Architecture Explorer(o CTRL-W, N)
  • Haga clic en Vista de clase y busque el espacio de nombres que contiene su interfaz en la lista que se abre.
  • A la derecha de la lista de espacios de nombres, hay un botón vertical que dice Types. Haga clic aquí
  • Seleccione Interfaces
  • Elige tu interfaz de la lista
  • Un botón vertical que dice Membersaparecerá a la derecha. Haga clic en ese botón
  • Escoger Implemented by (debajo Inbound Navigation) y eso proporcionará una lista de implementaciones de su interfaz.
  • Hacer doble clic en la implementación lo llevará a la clase.
Robaticus
fuente
Estoy bastante seguro de que Architecture Explorer es solo la edición Ultimate, pero esto funcionará.
Richard
Muchas gracias. Me gustó, pero en este contexto quiero cambiar rápidamente mi código.
user310291
6

En 2012 Ultimate, puede buscar la interfaz en el explorador de soluciones. Haga clic derecho en la interfaz y elija "Tipos derivados", las clases implementadas se mostrarán en el explorador de soluciones. No estoy seguro si funciona en expreso.

Jack Liu Shurui
fuente
No me di cuenta de eso. Gracias. <br/> Ahora, si solo hubiera una manera de hacer que el explorador de soluciones abra su árbol en el archivo que se muestra actualmente, entonces no tengo primero la información sobre herramientas del editor para obtener la ruta del archivo para derivar y luego navegar a través del explorador de soluciones para el archivo fuente, donde puedo determinar la lista de implementados para la interfaz ... Creo que la navegación por el código fuente debería convertirse en una característica más importante.
George
- Acabo de descubrir el comando "Ctrl +], S" que expande el árbol del explorador de soluciones al documento de edición actual (sincronización con el documento activo). El nodo de archivo resultante se puede expandir para exponer los tipos contenidos que, a su vez, se pueden hacer clic con el botón derecho para acceder al menú contextual que contiene el comando 'Tipos derivados'. Agradable.
George
2
@George, también puede hacer que Visual Studio SIEMPRE rastree el archivo abierto actual en el explorador de soluciones a través de Herramientas -> Opciones -> Proyectos y soluciones -> General -> "Rastrear elemento activo en explorador de soluciones"
MajorRefactoring
VS2012 Premium también tiene esta característica. En VS2015 Enterprise, esta característica ' Tipos derivados ' se ha dividido en dos características ' Tipos derivados ' e ' Implementados por ', incluso mejor :)
cateyes
6

La actualización 1 de Visual Studio 2015 (lanzada en diciembre de 2015) ahora ha agregado un clic derecho en la función 'Ir a implementación' como estándar.

PaulG
fuente
5

¡Para las personas que usan Resharper, presionar CTRL + F12 les hará ir directamente al método de clase!

Maximc
fuente
4

Esto no es posible. Lo que está describiendo tendría sentido solo si la interfaz se limitara a 1 implementación.

Considere este ejemplo:

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 usa vaya a implementación de Write in UseIWrite, lo lleva a la declaración de la interfaz, porque en ese punto cualquiera de las implementaciones de IWrite podría pasar al método.

Afortunadamente, algunas herramientas como, por ejemplo, ReSharper, le ofrecen encontrar todos los usos del método, para que pueda navegar fácilmente a la implementación deseada.

m0sa
fuente
1
... y si solo hay una implementación, R # lo llevará directamente allí sin más preámbulos.
Jay
1
No es gratis, pero tampoco lo es Visual Studio. ¿Cuánto vale su tiempo? :)
Jim Arnold
3
No es que no quiera pagar, es por el principio: esta es una característica básica de sentido común, es vergonzoso que tengas que pagar una vez más cuando ya
pagaste
3
@ user310291 Si bien estoy de acuerdo con usted, no comprar el producto que cumple exactamente la función que desea para "castigar" a un tercero por no proporcionarlo de inmediato, es cortarle la nariz para fastidiarle la cara.
TarkaDaal
1
Resharper proporciona esto sin tener que mostrar todos los usos. Puede seleccionar a qué implementación desea ir.
Michael Joyce
4

¡Visual Studio con la Actualización 1 ahora implementa esta característica! Simplemente haga clic derecho en el miembro y debería ver "Ir a implementación" justo debajo de "Ir a definición".

Jason Steele
fuente
2

Echa un vistazo a esta nueva extensión gratuita de Visual Studio 2013: implementador . Agrega la opción "Ir a implementación" al menú contextual del editor de Visual Studio.

No es tan confiable y rápido como Resharper, pero funciona bien.

Yura
fuente
2

Puedes probar el Ctrl + F12atajo. Le llevará a la implementación al igual que lo llevará a métodos que no sean de interfaz usando F12. [Lo probé en VS 2017, no estoy seguro acerca de otras versiones]

Akbar Badhusha
fuente
1
Este acceso directo funciona bien en vscode con mecanografiado.
Zuhair Taha
1

Visual Studio solo puede decirle a dónde se hace referencia, pero esto puede ser demasiado burdo.

Existen otras herramientas que pueden brindarle más información sobre la estructura de su aplicación, incluida qué clase implementa qué interfaz, qué método anula qué otro método, etc. Personalmente prefiero usar Understand For C / C ++.

Patricio
fuente
1

Ir a la declaración abrirá el método de interfaz. Al ir a la implementación, lo llevará o enumerará las clases que implementan el código para ese método de interfaz (no el método de interfaz en sí).

Actualizar

Como Jon Skeet señaló en los comentarios (y me perdí antes de responder), la característica que describí podría ser una característica de ReSharper ... no una de Visual Studio.

Jamie Dixon
fuente
0

No. Esto no es posible, a pesar de la elaborada estructura de código de memoria mantenida por VS, la navegación de código es bastante ... tacaña.

Parece que la única alternativa es una búsqueda global con "Buscar todas las referencias", seguida de una búsqueda manual de la lista resultante para excluir declaraciones de valores escritos, conversiones, etc. o el uso de otras herramientas dentro de VS que no sean el editor de código. Todo bastante complejo y decepcionante.

Jorge
fuente