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

135

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

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

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

IInterface iInterface = someObject;                        
iInterface.someMethod();

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

  • 4
    Как он узнает, какую реализацию вы хотите увидеть? (Я могу просмотреть иерархию типов, чтобы найти все известные реализации, но это может быть функция ReSharper ... Я не уверен.)
  • 3
    Да, это ReSharper.
Показать ещё 9 комментариев
Теги:
visual-studio

14 ответов

206
Лучший ответ

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

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

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

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


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


  • 0
    Хороший обходной путь. Я придерживаюсь этого, когда у меня нет Resharper
  • 1
    Ctrl-K Ctr-T работает для меня
Показать ещё 3 комментария
42

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

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

  • 4
    Вы можете использовать Alt + End, если вы используете resharper.
  • 1
    Не работал для меня Я использую VS Express 2013 для веб-сайтов.
Показать ещё 3 комментария
16

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

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

Изображение 7842

  • 3
    Испытание резарпера истекло на работе, попробовал это расширение и оно качается! Спасибо приятель
14

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

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

  • 0
    Это не дает воплощения.
  • 1
    @Robaticus на самом деле, это так. Это не самый удобный способ, но реализации будут смешаны со всеми остальными ссылками.
Показать ещё 4 комментария
8

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

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

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

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

  • 0
    Не заметил этого Благодарю. <br/> Теперь, если бы существовал только способ заставить обозреватель решений открыть его дерево для отображаемого в данный момент файла, чтобы мне не нужно сначала вызывать всплывающую подсказку редактора, чтобы получить путь к файлу, чтобы получить его, а затем перейти через обозреватель решений в исходный файл, где я могу определить список реализованных для интерфейса ... Навигация по исходному коду должна стать более важной функцией, я думаю.
  • 0
    - Только что обнаружил команду «Ctrl +], S», которая расширяет дерево обозревателя решений до текущего редактируемого документа (синхронизация с активным документом). Результирующий файловый узел затем может быть расширен для раскрытия содержащихся типов, которые, в свою очередь, можно щелкнуть правой кнопкой мыши для доступа к контекстному меню, содержащему команду «Производные типы». Ницца.
Показать ещё 2 комментария
5

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

4

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

4

Это невозможно. То, что вы описываете, будет иметь смысл только в том случае, если интерфейс будет ограничен 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, предлагают вам найти все способы использования метода, поэтому вы можете легко перейти к желаемой реализации.

  • 1
    … И если есть только одна реализация, R # доставит вас прямо туда без лишних слов.
  • 0
    ReShaper не бесплатный;)
Показать ещё 4 комментария
2

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

2

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

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

1

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

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

1

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

Обновление

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню