Есть ли способ перейти к реальной реализации метода за интерфейсом?

В Visual Studio при щелчке правой кнопкой мыши по вызову метода вы переходите к реализации этого метода внутри класса, за исключением того, что вы получаете доступ к этому методу через интерфейс: в этом случае вы переходите к методу интерфейса не к фактическому реализация.

Есть ли способ/советы (ключевой ярлык или что-то еще) для доступа к этой фактической реализации? В противном случае вы застряли, чтобы добавить комментарий, чтобы помнить, где вы его реализовали, что действительно непродуктивно и подвержено ошибкам!

Обновление: интересные ответы, но я не очень доволен, потому что все они громоздки. Я приведу точный пример:

IInterface iInterface = someObject;                        
iInterface.someMethod();

На самом деле, если Visual Studio было просто немного умно, чтобы посмотреть только одну строку над вызовом метода, он увидит, где находится реальный объект. И это спасло бы мне много нажатий клавиш и избегало бы использовать "найти все ссылки", а затем просканировать строки усталыми глазами, чтобы увидеть, какая строка содержит правильную:)

Ответ 1

Я делаю следующее:

1) Щелкните правой кнопкой мыши на методе и выберите "Просмотреть иерархию вызовов" (или сочетание клавиш Ctrl + K, Ctrl + T)

2) Разверните папку "Реализует x", которая затем покажет вам все реализации этого метода. Нажмите на один, чтобы перейти туда.

Относительно быстро и легко. Раздражающе, хотя, похоже, не существует эквивалента для самого интерфейса.


update: начиная с обновления Visual Studio 2015 1, щелкните правой кнопкой мыши на методе и выберите переход к реализации. Вы также можете сопоставить его с сочетанием клавиш с помощью "Сервис" > "Параметры" > "Среда" > "Клавиатура" и выполните команду "Редактировать". Ярлык по умолчанию - Ctrl+F12. (F12 будет перемещаться по интерфейсу).


Ответ 2

С VS2013 можно поместить курсор над методом и использовать Navigate To... (CTRL +,), и он отобразит все местоположения, где объявлено имя. Не работает, если разные интерфейсы используют одни и те же имена методов.

С VS2015 Update 1 теперь появился новый ярлык под названием "Перейти к реализации".

Ответ 3

Я создал бесплатное расширение для Visual Studio 2010 и Visual Studio 2012 под названием Inheritance Margin, чтобы предоставить эту особую функцию, а также дать четкое указание, когда метод реализует метод интерфейса из-за совпадения подписи. В текущей версии вы можете щелкнуть правой кнопкой мыши на любом глифе, чтобы получить меню элементов для навигации.

Поле наследования - Галерея Visual Studio

Screenshot
(источник: microsoft.com)

Ответ 4

Щелкните правой кнопкой мыши "Найти все ссылки".

Это отобразит строку кода для всех мест, где используется метод, включая объявление интерфейса и реализации метода интерфейса. Затем вы можете щелкнуть по строке, чтобы перейти к коду.

Ответ 5

В зависимости от версии Visual Studio, которую у вас есть, я скажу условно "да".

В настоящее время я работаю на Ultimate, и у меня нет других версий для проверки этого. Тем не менее, в Ultimate вы можете использовать Explorer для поиска реализаций. Это немного больше, чем метод правого щелчка, но здесь, как это работает.

  • Перейдите к View->Architecture Explorer (или CTRL-W, N)
  • Нажмите "Просмотр класса" и найдите пространство имен, которое содержит ваш интерфейс в открывшемся списке.
  • Справа от списка пространств имен находится вертикальная кнопка с надписью Types. Нажмите здесь
  • Выберите Interfaces
  • Выберите свой интерфейс из списка
  • Затем справа появится вертикальная кнопка с надписью Members. Нажмите эту кнопку
  • Выберите Implemented by (под Inbound Navigation) и предоставит список реализаций вашего интерфейса.
  • Двойной щелчок по реализации приведет вас к классу.

Ответ 6

В течение 2012 Ultimate вы можете искать интерфейс в браузере решений. Щелкните правой кнопкой мыши по интерфейсу и выберите "Производные типы", реализованные классы будут показаны в браузере решений. Не уверен, что он работает в экспресс.

Ответ 7

Обновление Visual Studio 2015 Update 1 (выпущено в декабре 2015 г.) теперь добавило в качестве стандарта функцию "Переход к внедрению" правой кнопкой мыши.

Ответ 8

Это невозможно. То, что вы описываете, будет иметь смысл только в том случае, если интерфейс будет ограничен 1 реализацией.

Рассмотрим следующий пример:

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

Если вы используете переход к реализации Write in UseIWrite, он приведет вас к объявлению интерфейса, потому что в этот момент в метод можно передать любую реализацию IWrite.

К счастью, некоторые инструменты, например, ReSharper, предлагают вам найти все способы использования метода, поэтому вы можете легко перейти к желаемой реализации.

Ответ 9

Для людей, которые используют Resharper, нажатие CTRL + F12 заставит вас перейти непосредственно к методу класса!

Ответ 10

Visual Studio с обновлением 1 теперь реализует эту функцию! Просто щелкните правой кнопкой мыши на элементе, и вы увидите "Перейти к реализации" в разделе "Перейти к определению".

Ответ 11

Ознакомьтесь с новой бесплатной версией Visual Studio 2013 - Реализатор. Он добавляет параметр "Перейти к реализации" в контекстное меню редактора Visual Studio.

Это не так надежно и быстро, как Resharper, но работает ли это нормально.

Ответ 12

Переход к объявлению откроет метод интерфейса. Перейдя к реализации, вы получите или перечислите для вас классы, реализующие код для этого метода интерфейса (а не сам интерфейс).

Обновление

Как отметил Джон Скит в комментариях (и я пропустил перед ответом), описанная выше функция может быть функцией ReSharper... не Visual Studio.

Ответ 13

Visual Studio может только сообщать вам, где она указана, но это может быть слишком грубо.

Существуют и другие инструменты, которые могут рассказать вам больше о структуре вашего приложения, включая класс, который реализует интерфейс, какой метод перекрывает другой метод и т.д. Я лично предпочитаю использовать Understand для C/С++.

Ответ 14

Нет. Это невозможно, несмотря на сложную структуру кода памяти, поддерживаемую VS, навигацию по коду довольно... скупо.

Кажется, единственной альтернативой является глобальный поиск с помощью "Найти все ссылки", за которым следует ручной поиск результирующего списка, чтобы исключить объявления типизированных значений, преобразования и т.д. или использование других инструментов в VS, кроме редактора кода, Все довольно сложно и неутешительно.

Ответ 15

Вы можете попробовать Ctrl + F12 ярлык. Это приведет вас к реализации точно так же, как и к неинтерфейсным методам, использующим F12. [Я пробовал это в VS 2017, не уверен насчет других версий]