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

182

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

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

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

IInterface iInterface = someObject;                        
iInterface.someMethod();

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

user310291
источник
4
Как он узнает, какую реализацию вы хотите увидеть? (Я могу просмотреть иерархию типов, чтобы найти все известные реализации, но это может быть функция ReSharper ... Я не уверен.)
Джон Скит
1
@supercat: Вы имеете в виду при отладке?
Джон Скит
2
ReSharper реализует это, предоставляя список реализаций на выбор, где он не может обнаружить конкретную. Хорошая функция, и я скучаю по ней, так как «Найти все ссылки» возвращает слишком много!
Фентон
4
Впервые в жизни Джон Скит говорит: «Я не уверен». для вопроса C # в SO.
Мутху Ганапати Натан
3
@MuthuGanapathyNathan Вероятно, он пытался на этот раз выглядеть так, будто он человек.
Vort3x

Ответы:

258

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

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

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

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


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


MajorRefactoring
источник
Хороший обходной путь. Я придерживаюсь этого, когда у меня нет Resharper
Роман
5
Я могу пропустить шаг 1. Просто «Просмотр иерархии вызовов» (или сочетание клавиш Ctrl + K, Ctrl + T) прямо из того места, где вы работаете, и пропустите интерфейс все вместе. Я в VS 2013.
Тони Л.
Есть ли горячая клавиша для пиковой реализации? Я попытался ALT-CTRL-F12 безуспешно. (Пик ALT-F12)
Леви Фуллер,
47

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

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

Рольф Кристенсен
источник
4
Вы можете использовать Alt + End, если вы используете resharper.
brechtvhb
1
Не работал для меня Я использую VS Express 2013 для веб-сайтов.
Акира Ямамото
Я считаю это самым простым солнцем, не отрывая руки от клавиатуры. Благодаря Рольф
Jp Vinjamoori
1
Это самое быстрое решение.
мбудник
@brechtvhb Вы также можете установить это как Alt + End без R #, настроив сочетание клавиш для команды Edit.NavigateTo:)
demoncodemonkey
17

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

Маржа наследования - галерея Visual Studio

Скриншот
(источник: microsoft.com )

Сэм Харвелл
источник
3
Испытание резарпера истекло на работе, попробовал это расширение и оно качается! спасибо чувак
Джорджио Минарди
15

Щелкните правой кнопкой мыши, затем «Найти все ссылки».

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

Фил Карсон
источник
Это не дает воплощения.
Робатик
1
@Robaticus на самом деле, это так. Это не самый удобный способ, но реализации будут смешаны со всеми остальными ссылками.
Рекс М
Это единственное, что я делаю сейчас, но прежде всего это утомительно, так как у меня нет хороших глаз :)
user310291
6
Альтернативой поиску символов является иерархия вызовов. У него есть методы, сгруппированные в структуру папок: вызовы «...», вызовы «...» и реализации «...»
Фил Карсон,
4
Сочетание клавиш для «Найти все ссылки» есть Shift + F12.
IsmailS
8

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

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

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

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

Джек Лю Шуруи
источник
Не заметил этого Спасибо. <br/> Теперь, если бы был только способ заставить обозреватель решений открыть его дерево для отображаемого в данный момент файла, чтобы мне не нужно было сначала вызывать всплывающую подсказку редактора, чтобы получить путь к файлу, чтобы получить его, а затем перейти через обозреватель решений в исходный файл, где я могу определить список реализованных для интерфейса ... Навигация по исходному коду должна стать более важной функцией, я думаю.
Джордж
- Только что обнаружил команду «Ctrl +], S», которая расширяет дерево обозревателя решений до текущего редактируемого документа (синхронизация с активным документом). Результирующий файловый узел затем может быть расширен для раскрытия содержащихся типов, которые, в свою очередь, можно щелкнуть правой кнопкой мыши, чтобы получить доступ к контекстному меню, содержащему команду «Производные типы». Ницца.
Джордж
2
@ Джордж, вы также можете сделать так, чтобы Visual Studio ВСЕГДА отслеживал текущий открытый файл в обозревателе решений через Сервис -> Параметры -> Проекты и решения -> Общие -> «Отслеживать активный элемент в
обозревателе
VS2012 Premium также имеет эту функцию. В VS2015 Enterprise эта функция « Производные типы » была разделена на две функции: « Производные типы » и « Реализовано », что еще лучше :)
cateyes
6

В Visual Studio 2015 Update 1 (выпущено в декабре 2015 г.) теперь добавлена ​​функция щелчка правой кнопкой мыши «Перейти к реализации» в качестве стандартной.

PaulG
источник
5

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

Maximc
источник
4

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

Рассмотрим этот пример:

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

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

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

m0sa
источник
1
… И если есть только одна реализация, R # доставит вас прямо туда без лишних слов.
Джей
1
Это не бесплатно, но и Visual Studio. Сколько стоит ваше время? :)
Джим Арнольд
3
Дело не в том, что я не хочу платить, это по принципу: это довольно простая функция,
основанная на
3
@ user310291 Хотя я согласен с вами, не покупать продукт, который выполняет именно ту функцию, которую вы хотите, чтобы «наказать» третье лицо за то, что он не предоставил его «из коробки», - это отрезать вам нос, несмотря на ваше лицо.
TarkaDaal
1
Resharper обеспечивает это без необходимости показывать все использования. Вы можете выбрать, к какой реализации вы хотите перейти.
Майкл Джойс
4

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

Джейсон Стил
источник
2

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

Он не так надежен и быстр, как Resharper, но отлично справляется со своей задачей.

Yura
источник
2

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

Акбар Бадхуша
источник
1
этот ярлык отлично работает на VScode с машинописью.
Зухайр Таха
1

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

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

Патрик
источник
1

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

Обновить

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

Джейми Диксон
источник
0

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

Кажется, единственной альтернативой является глобальный поиск с «Find All Reference», за которым следует ручной поиск в результирующем списке, чтобы исключить объявления типичных значений, преобразования и т. Д. Или использование других инструментов внутри VS, кроме редактора кода. Все довольно сложно и неутешительно.

Джордж
источник