如何查找接口的所有实现?

74
假设您已在C#中定义了一个接口。 查找提供接口实现的所有类的最简单方法是什么?
暴力方法是在Visual Studio中使用“查找引用”,并手动浏览结果以区分用法和实现,但对于大型代码库中被大量引用但实现相对较少的接口,这可能耗时且容易出错。
在Java中,在代码库上运行javadoc(使用-private选项包括私有类)将为接口生成文档页面(例如Comparable),其中包括接口的所有实现类以及任何子接口(尽管它不包括子接口的实现类,但这些相对容易通过深入到列出的子接口来确定)。 我正在寻找的就是这个功能,但使用C#和Visual Studio。

@akasoggybunz 我不明白为什么可以添加问题提问者没有要求的标签。谁在乎SEO呢? - The incredible Jan
12个回答

115

在普通的Visual Studio(自2010年以来)中,您可以右键单击方法名称(接口中的定义或其他类中的实现),然后选择查看调用层次结构。在调用层次结构窗口中,有一个“实现”文件夹,您可以在其中找到接口方法实现的所有位置。


12
这应该是被接受的答案,因为它 (a) 完成了任务,且 (b) 不依赖于 [收费的] 第三方工具。 - NekojiruSou

36

如果您安装了 ReSharper 插件:

在 Visual Studio 中,右键单击类型名称并选择“转到派生类”。或者,选择类型名称,然后转到 ReSharper / View / Type Hierarchy 以打开一个新标签页。(菜单会显示键盘快捷键 - 这可能会有所不同,这就是为什么我解释如何找到它的原因:)

如果您没有安装 ReSharper 插件:

  • 您可以使用 Reflector,该工具能够轻松地显示所有类型层次结构。在类型名称下方有可展开项,用于基类型和派生类型。类似的工具还有 ILSpydotPeek
  • 购买 ReSharper - 它是一个很棒的工具 :)

1
反射器不是免费的。 - beruic
2
@beruic:不再是这样了 - 我写这篇文章的时候可能还是这样 :) 我会添加一些免费选项... - Jon Skeet
@JonSkeet 能否使用 Resharper 浏览第三方 DLL?例如,我想查看某个 NuGet 包中接口的实现,而这些实现在该包中。 - Wahid Bitar
1
@WahidBitar:我希望它能在你的项目中的程序集内完成这个任务。我建议你试一试 :) - Jon Skeet
找到了。你可以从检查 -> 层次结构中获取它。非常感谢我的大师 ^_^。顺便说一句,你总是激励着我。谢谢 :) - Wahid Bitar
显示剩余5条评论

32
将光标放在类或接口类型上,然后按CTRL + F12

3
请注意,此方法仅适用于Visual Studio 2015更新1及以上版本。 - Nik A.
@JokeHuang,在我的IDE环境中确实可以运行。我在Rider中尝试了,也可以工作。 但是,您需要在自己的类中实现它。您无法在内置类型中找到它。 - Bahtiyar Özdere
@BahtiyarÖzdere 实际上,我想找到所有间接实现此接口的类。第三方库类实现了内置接口,而我的类继承自第三方类。 - huang
@JokeHuang 你用的是哪个集成开发环境(IDE)? - Bahtiyar Özdere
@BahtiyarÖzdere VS2019 Community 16.10.2。 - huang

15

使用Visual Studio 2010+

右键单击成员方法,选择“查看调用层次结构”。展开实现文件夹,这会列出所有实现该方法所在接口的类型。

用户界面截图

使用Resharper 7

右键单击接口 > 转到 > 派生符号。粗体列出的符号直接从该接口派生而来。非粗体符号从超类派生。

用户界面截图


10

如果你使用的是Visual Studio 2015,有一个很棒的扩展程序叫做Go To Implementation。试试看吧。

安装完扩展程序后,你只需要在界面中任何出现接口(例如IUrlShortener)的地方右键单击,然后选择Go To Implementation(转到实现)菜单。如果只有一个类实现了该接口,点击菜单将直接带您到该类。如果有多个类实现了该接口,则会列出所有类。


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - ForceMagic
@ForceMagic,“答案的基本部分”是什么?这是一个可下载扩展的链接。不过我会在答案中添加更多解释,谢谢。 - Nik A.
终于!虽然我仍然无法相信这个关键功能在VS中缺失。 - wziska
3
正如你所希望的,这个功能现在已经实现在Visual Studio 2015 Update 1 RC中 :) - Nik A.

9

如果您使用的是Visual Studio 2015,请安装Visual Studio 2015更新1 RC。从Visual Studio博客上可以了解到:

今天我们发布了Visual Studio 2015更新1 RC版本,该版本是在三周前发布的更新1 CTP版本基础上构建的。除了在此处描述的CTP中引入的功能外,发布候选版还包括以下内容:

  • 转到实现。这是许多人一直在等待的功能:只需右键单击界面或抽象方法,然后选择此命令即可导航到实现。

1
这个的快捷键是CTRL+ F12 - Alexandru

2
你可以使用正则表达式搜索接口。
:(\ *[^},]+,)*\ *IMyInterfaceName

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

Visual Studio Screenshot


2
我更喜欢“导航到...”选项。将光标放在函数调用上,尝试以下操作:
快捷键:
1. Ctrl+, (Ctrl+逗号)
菜单:
1. 编辑菜单 2. 点击“导航到...”
好处:
- 不会显示所有引用,如“查找所有引用” - 显示实现的“类型”,因此它会注意到哪个是您的接口

2

我认为这个功能不是内置在VS中的,但如果我没记错,Resharper 有此功能。


1
使用Shift + F12显示所有引用,包括定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接