您如何找到接口的所有实现?


70

假设您有一个用C#定义的接口。查找提供接口实现的所有类的最简单方法是什么?

蛮力方法是在Visual Studio中使用“查找引用”,并手动浏览结果以将实现与实现分开,但是对于大型代码库中的接口,该接口在很少的实现中被大量引用,因此可以耗时且容易出错。

在Java中,在代码库上运行javadoc(使用-private选项包括私有类)将为该接口(例如Comparable)生成一个文档页面,其中包括该接口以及所有子接口的所有实现类(尽管它没有包括实现子接口的类,则可以通过深入列出的子接口来相对容易地确定这些类)。我需要的只是C#和Visual Studio的功能。

Answers:


36

(根据评论进行编辑...)

如果您安装了ReSharper:

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

如果您没有ReSharper:

  • 您可以使用Reflector,它可以很容易地向您显示所有类型层次结构-在类型名称的下面是基本类型和派生类型的可扩展项。可以使用类似的工具,例如ILSpydotPeek
  • 购买ReSharper-这是一个很棒的工具:)

ReSharper已经在我的请求列表中;我认为它可能具有此功能,但可惜,我还没有。Reflector允许我获得特定搜索的答案,尽管查找并添加所有引用了接口定义的程序集都有些麻烦!
iammichael

Reflector不是免费的
比利时

1
@beruic:不再了-我写这篇文章时又回来了,我想:)将添加一些免费选项...
Jon Skeet

@JonSkeet Resharper甚至可以浏览第三方DLL吗?例如,我想在某些NuGet程序包中查看接口的实现,而这些实现都在该程序包中。
Wahid Bitar

1
@WahidBitar:我希望它能在您项目的程序集中完成。我建议您尝试一下:)
Jon Skeet

103

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


我看不到这样的菜单选项(在VS 2008中)
iammichael

1
自VS2010可用以来,似乎-我刚刚在VS2013 Express中进行了尝试,并且它也在那里-非常高兴有F12的替代品,它在使用依赖项注入的代码中并不总是如您所愿。
J c

9
这应该是“已接受的答案”,因为它(a)可以完成工作,并且(b)不依赖于[付费]第三方工具
NekojiruSou 2014年

24

将光标放在类或接口类型上,然后

CTRL + F12


2
请注意,这仅在Visual Studio 2015 Update 1及更高版本中有效。
Nik A.

14

使用Visual Studio 2010+

右键单击成员方法,然后选择视图调用层次结构。展开工具文件夹。这列出了实现该方法所属接口的所有类型。

在此处输入图片说明

与Resharper 7

右键单击界面>导航到>派生符号。粗体列出的符号直接来自于接口。非粗体符号来自超类。

在此处输入图片说明


10

对于使用Visual Studio 2015的用户,有一个很棒的扩展名为Go To Implementation。试试看。

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


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
ForceMagic

@ForceMagic什么是“答案的关键部分”?它是可下载扩展的链接。我会在答案中添加更多解释,谢谢。
Nik A.

最后!尽管我仍然无法相信VS中缺少此关键功能。
wziska 2015年

3
@wziska如您所愿,此功能现已在Visual Studio 2015 Update 1 RC中实现:)
Nik

8

对于使用Visual Studio 2015的用户,请安装Visual Studio 2015 Update 1 RC。从Visual Studio博客中

今天,我们发布了Visual Studio 2015 Update 1 RC,它基于我们三周前发布的Update 1 CTP。除了此处介绍的CTP中引入的功能外,候选版本还包括以下内容:

  • 转到实施。你们中许多人一直在等待的功能:右键单击接口或抽象方法,然后选择此命令以导航至实现。

1
热键为CTRL+F12
Alexandru



2

我更喜欢“导航到...”选项。将光标放在函数调用上,尝试以下操作:

快捷键:

  1. Ctrl +,(Ctrl +逗号)

菜单:

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

好处:

  • 不显示所有参考,例如“查找所有参考”
  • 显示实现的“类型”,因此将指出哪个是您的界面


0

如果使用resharper,则ALT + END快捷方式可能有助于查找所有继承者。


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.