有没有一种方法可以导航到接口背后的方法的实际实现?


180

在Visual Studio中,当您右键单击一个方法调用时,您将在类内转到该方法的实现,除非通过接口访问此方法:在这种情况下,将转到接口方法而不是实际的实现。

是否有访问此实际实现的方法/提示(快捷键或其他方法)?否则,您将不得不添加一些评论,只是想记住您在哪里实现了它,但实际上并没有效率并且容易出错!

更新:有趣的答案,但我并不真正满意,因为所有这些都很麻烦。我将举一个精确的例子:

IInterface iInterface = someObject;                        
iInterface.someMethod();

实际上,如果Visual Studio稍微聪明一点,只在方法调用上方看一行,它将看到实际对象在哪里。这样可以节省很多击键次数,避免使用“查找所有引用”,然后用疲倦的眼睛扫描各行以查看哪一行包含正确的行:)


4
它怎么知道您想看到哪种实现?(我可以查看类型层次结构以找到所有已知的实现,但这可能是ReSharper功能……我不确定。)
Jon Skeet

1
@supercat:您的意思是在调试时?
乔恩·斯基特

2
ReSharper通过提供一系列实现来实现它,以从无法检测到特定实现的地方进行选择。不错的功能,我真的很想念它,因为“查找所有参考”带回的太多了!
Fenton'9

4
我第一次见过,乔恩·斯基特(Jon Skeet)说“我不确定”。SO中的C#问题。
Muthu Ganapathy Nathan 2013年

3
@MuthuGanapathyNathan他可能试图一次看起来像是人类。
Vort3x

Answers:


257

我执行以下操作:

1)右键单击该方法,然后单击“查看通话层次”(或快捷键Ctrl + K,Ctrl + T)

2)展开“ Implements x”文件夹,然后将向您显示该方法的所有实现。单击一个去那里。

相对简单快捷。令人讨厌的是,尽管接口本身似乎没有等效项。


更新:从Visual Studio 2015更新1开始,右键单击方法,然后选择转到实现。您也可以通过工具>选项>环境>键盘将其映射到键盘快捷方式,然后搜索Edit.GoToImplementation命令。默认快捷方式是Ctrl+F12。(F12将导航到界面)。



好的解决方法。当我没有Resharper时,我会坚持使用
Roman

5
我可以跳过步骤1。只需从工作位置“查看呼叫层次”(或快捷键Ctrl + K,Ctrl + T)开始,就一起跳过界面。我在2013年VS
托尼L.

是否有任何热键可以实现峰值?我尝试了ALT-CTRL-F12,但没有成功。(峰值为ALT-F12)
Levi Fuller

46

使用VS2013,可以将光标放在该方法上,并使用“导航到...”(CTRL +,),它将显示声明该名称的所有位置。如果不同的接口使用相同的方法名称,则无法正常工作。

借助VS2015 Update 1,现在有了一个名为“ Go To Implementation”的新快捷方式。


4
如果您使用的是共享工具,则可以使用Alt + End。
brechtvhb 2014年

1
没为我工作。我正在使用VS Express 2013 for Web。
2014年

我发现这是最简单的解决方案,而无需您从键盘上移开。感谢Rolf
Jp Vinjamoori 2015年

1
这是最快的解决方案。
mbudnik

@brechtvhb您也可以通过自定义命令的键盘快捷方式将其设置为Alt + End,而不使用R#Edit.NavigateTo:)
demoncodemonkey

17

我为Visual Studio 2010和Visual Studio 2012创建了一个名为Inheritance Margin的免费扩展,以提供此特定功能,并在方法由于签名匹配而实现接口方法时给出明确指示。在当前版本中,您可以右键单击任何字形以获取要导航到的项目菜单。

继承裕度-Visual Studio画廊

Screenshot
(来源:microsoft.com


3
翻土机试验已在工作中到期,尝试了此扩展,因此震撼!感谢花花公子
Giorgio Minardi 2014年

15

右键单击,然后单击“查找所有引用”。

这将显示使用该方法的所有位置的代码行,包括接口声明和接口方法的实现。然后,您可以单击该行以跳至代码位置。


这没有给出植入。
Robaticus 2011年

1
@Robaticus确实如此。这不是最方便的方法,但是将实现与其他所有参考混合在一起。
Rex M

那是我现在唯一要做的,但是最累人的是,因为我的眼睛不好:)
user310291 2011年

6
查找符号的替代方法是调用层次结构。它具有按文件夹结构分组的方法:调用“ ...”,调用“ ...”和实现“ ...”
Phil Carson

4
“查找所有参考”的快捷键是Shift + F12
IsmailS 2014年

8

根据您所拥有的Visual Studio版本,我将有条件地说“是”。

我目前正在Ultimate上运行,并且没有其他版本可以对此进行验证。也就是说,在Ultimate中,您可以使用Architecture Explorer查找实现。它比右键单击方法要复杂一些,但这是它的工作原理。

  • 转到View->Architecture Explorer(或CTRL-W,N)
  • 单击类视图,然后在打开的列表中找到包含您的接口的名称空间。
  • 在名称空间列表的右侧,是一个垂直按钮,表示Types。点击这个
  • 选择 Interfaces
  • 从列表中选择您的界面
  • 显示一个垂直按钮,Members然后将出现在右侧。点击那个按钮
  • 选择Implemented by(在下方Inbound Navigation),这将提供您的界面的实现列表。
  • 双击实现将带您进入课程。

我相当确定Architecture Explorer仅是Ultimate版,但是可以使用。
理查德

非常感谢,我竖起大拇指,但是在这种情况下,我想快速更改代码。
user310291

6

在2012 Ultimate中,您可以在解决方案资源管理器中搜索界面。右键单击界面,然后选择“派生类型”,已实现的类将显示在解决方案资源管理器中。不知道它是否可以快速表达。


没注意到。谢谢。<br/>现在,如果只有一种方法可以使解决方案资源管理器将其树打开到当前显示的文件,那么我不必先调出编辑器的工具提示来获取文件的路径,以便派生然后导航通过解决方案资源管理器找到源文件,在这里我可以确定该接口的实现者列表...源代码导航应该成为我认为更重要的功能。
乔治

-刚刚发现了“ Ctrl +],S”命令,该命令将解决方案资源管理器树扩展到当前的编辑文档(与活动文档同步)。然后,可以扩展结果文件节点以显示包含的类型,然后可以右键单击包含的类型以访问包含“派生类型”命令的上下文菜单。真好
乔治

2
@George,您还可以通过工具->选项->项目和解决方案->常规->“跟踪解决方案资源管理器中的活动项”,使Visual Studio始终跟踪解决方案资源管理器中的当前打开文件
MajorRefactoring 2013年

VS2012 Premium也具有此功能。在VS2015 Enterprise中,此“ 派生类型 ”功能已拆分为两个功能“ 派生类型 ”和“ 实现者 ”,甚至更好:)
cateyes

6

现在,Visual Studio 2015 Update 1(发布于2015年12月)已作为标准添加了右键单击“转到实施”功能。


5

对于使用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();
  }
}

如果使用UseIWrite中的Write 实现,它将带您到接口的声明,因为到那时,任何IWrite实现都可以传递给方法。

值得庆幸的是,诸如ReSharper之类的一些工具为您提供了该方法的所有用法,因此您可以轻松导航至所需的实现。


1
…如果只有一个实现,R#将带您直接过去。
杰伊(Jay)

1
它不是免费的,但Visual Studio也不免费。您的时间值多少钱?:)
Jim Arnold

3
并不是我不想付款,而是基于原则:这是非常基本的常识功能,
可惜的是,

3
@ user310291虽然我同意您的意见,但并未购买具有您想要的功能的产品,以“惩罚”未提供即开即用的第三方,却切断了您的鼻子,以使您容颜。
TarkaDaal 2012年

1
Resharper无需显示所有用法即可提供此功能。您可以选择要执行的实现。
2014年

4

Visual Studio Update 1现在实现了此功能!只需右键单击成员,您应该在“转到定义”下看到“转到实现”。


2

签出这个新的免费Visual Studio 2013扩展- 实现者。它将选项“转到实现”添加到Visual Studio编辑器上下文菜单。

它不像Resharper那样可靠和快速,但它的工作还不错。


2

您可以尝试Ctrl + F12快捷方式。它将导致您实现,就像它将导致您使用F12进入非接口方法一样。[我在VS 2017中尝试过,不确定其他版本]


1
此快捷方式在带有Typescript的vscode上可以正常工作。
Zuhair Taha

1

Visual Studio只能告诉您引用的位置,但这可能太粗糙了。

还有其他工具可以告诉您有关应用程序结构的更多信息,包括哪个类实现哪个接口,哪个方法覆盖另一个方法等等。我个人更喜欢使用Understand For C / C ++。


1

转到声明将打开接口方法。转到实现,将带您或为您列出实现该接口方法(而不是接口方法本身)的代码的类。

更新资料

正如乔恩·斯基特(Jon Skeet)在评论中指出的那样(我在回答之前就错过了),我描述的功能可能是ReSharper功能,而不是Visual Studio。


0

不会。尽管VS维护了复杂的内存代码结构,但这是不可能的。

似乎唯一的选择是使用“查找所有引用”进行全局搜索,然后手动搜索结果列表以排除类型化的值声明,转换等,或者使用VS中除代码编辑器之外的其他工具。一切都相当复杂和令人失望。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.