你如何find一个接口的所有实现?

假设你有一个在C#中定义的接口。 find提供接口实现的所有类的最简单的方法是什么?

暴力方法将使用Visual Studio中的“查找引用”,并手动查看结果以将用法从实现中分离出来,但对于大量引用相对较less的实现的大型代码库中的接口,耗时且容易出错。

在Java中,在代码库上运行javadoc(使用-private选项来包含私有类)将为接口生成一个文档页面(比如Comparable ),该页面包括接口的所有实现类以及任何子接口(尽pipe它不包括子接口的实现类,通过深入到列出的子接口,这些相对容易确定)。 这是我正在寻找的function,但与C#和Visual Studio。

(根据评论编辑…)

如果你安装了ReSharper:

在Visual Studio中,右键单击types名称,然后select“转到inheritance者”。 或者,selecttypes名称,然后转到ReSharper / View / Type Hierarchy以打开一个新选项卡。 (菜单会显示你的键盘快捷键 – 这可以改变,这就是为什么我解释如何find它:)

如果你没有ReSharper:

  • 您可以使用Reflector ,它能够非常容易地向您显示所有的types层次结构 – 仅在types名称下是基types和派生types的可扩展项。 类似的工具可用,如ILSpy和dotPeek 。
  • 购买ReSharper – 这是一个伟大的工具:)

您可以右键单击方法名称(在其他类中的接口或实现中定义),然后select“查看调用层次结构”。 在Call Hierarchy窗口中有“Implements”文件夹,您可以在其中find接口方法实现的所有位置。

使用Visual Studio 2010+

右键单击成员方法,然后select查看调用层次结构。 展开“实现”文件夹。 这列出了实现该方法所属的接口的所有types。

在这里输入图像描述

用Resharper 7

右键单击界面>导航到>派生符号。 以粗体显示的符号直接来自界面。 非粗体符号来自超类。

在这里输入图像描述

对于那些使用Visual Studio 2015的人来说,这个叫做Go To Implementation的令人敬畏的扩展。 试一试。

一旦你安装了扩展,你可以右键单击任何出现的界面(例如IUrlShortener),然后单击Go To Implementation菜单。 如果您只有一个实现界面的类,单击该菜单将直接将您带到课程中。 如果你有多个实现接口的类,它会列出所有的类。

将光标放在类或接口types上

CTRL + F12

对于那些使用Visual Studio 2015,安装Visual Studio 2015更新1 RC。 从Visual Studio博客 :

今天,我们发布了Visual Studio 2015 Update 1 RC,它build立在三周前发布的Update 1 CTP上。 除了这里描述的CTP中引入的function,Release Candidate还包括以下内容:

  • 去执行 。 许多人一直在等待的function:只需右键单击一个接口或抽象方法,并select此命令导航到实现。

我不认为这个function是VS内置的,但是IIRC Resharper有这个function。

你可以做一个正则expression式search界面。

 :(\ *[^},]+,)*\ *IMyInterfaceName 

CTRL + SHIFT + F启动以下窗口:

Visual Studio截图

使用Shift + F12显示所有参考,包括定义。

我更喜欢“导航至…”选项。 将光标放在该function上,请尝试以下操作:

快捷键:

  1. Ctrl +,(Ctrl +逗号)

菜单:

  1. 编辑菜单
  2. 点击“导航至…”

优点:

  • 不显示所有引用,如“查找所有引用”
  • 显示实现的“types”,以便注意哪个是您的接口

如果您使用resharper ALT + END快捷键可能有助于find所有的inheritance者。

我听说Doxygen是.net,就像javadoc是java一样。

对于任何仍在使用VS2010的人来说,假设你只有一个接口实现(find第一个实现),那么这里有一个解决scheme可以让你连接一个键盘快捷键来实现这个function。

  1. 进入工具 – >选项 – >环境 – >键盘
  2. 在显示命令包含框中,inputViewCallHierarchy
  3. 将其重新映射到Ctrl + Shift + Alt + K,使macros容易打开
  4. 好的,closures选项。

  5. Alt + F8调出macros浏览器

  6. 右键单击Module1并selectNew Macro
  7. 把这个代码放在新macros的位置(它会像Sub Macro1()… End Sub

     Sub GoToImplementation() '//Open call hierarchy SendKeys.SendWait("+^%K") '//Restore navigation to predictable state SendKeys.SendWait("{DOWN}") SendKeys.SendWait("{DOWN}") SendKeys.SendWait("{LEFT}") SendKeys.SendWait("{LEFT}") SendKeys.SendWait("{LEFT}") '//Navigate to the implements branch SendKeys.SendWait("{RIGHT}") SendKeys.SendWait("{DOWN}") SendKeys.SendWait("{DOWN}") SendKeys.SendWait("{DOWN}") SendKeys.SendWait("{RIGHT}") '//Go to the first implentation and open it SendKeys.SendWait("{DOWN}") SendKeys.SendWait("{ENTER}") End Sub 
  8. 保存并退出macros编辑器
  9. 进入工具 – >选项 – >环境 – >键盘
  10. 在显示命令包含框中,inputGoToImplementation
  11. 重新映射到未使用的东西,我select了Ctrl + Alt + K
  12. 您也可以通过工具 – >自定义 – >命令 – >上下文菜单 – >编辑器上下文菜单| 代码窗口 – >添加命令
  13. 擦你的额头