【问题标题】:How do you find all implementations of an interface?如何找到接口的所有实现?
【发布时间】:2010-10-11 20:18:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# visual-studio resharper reflector


    【解决方案1】:

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

    【讨论】:

    • 我没有看到这样的菜单选项(在 VS 2008 中)
    • 似乎自 VS2010 起可用 - 我刚刚在 VS2013 Express 中尝试过它,它也在那里 - 很高兴有 F12 的替代品,它并不总是在使用依赖注入的代码中达到预期的效果.
    • 这应该是公认的答案,因为它 (a) 完成了工作,并且 (b) 不依赖 [付费] 第三方工具
    【解决方案2】:

    (根据评论编辑...)

    如果您安装了 ReSharper:

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

    如果您没有 ReSharper:

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

    【讨论】:

    • ReSharper 已经在我的请求列表中;我想它可能有这个能力,但可惜我还没有。 Reflector 让我能够获得特定搜索的答案,尽管找到并添加所有引用具有接口定义的程序集有点痛苦!
    • Reflector 不是免费的
    • @beruic:不再是了——我想我写这篇文章的时候它又回来了:) 将添加一些免费选项...
    • @JonSkeet Resharper 是否浏览第三方 DLL?例如,我想查看某个 NuGet 包中某个接口的实现,并且该实现在该包中。
    • @WahidBitar:我希望它能够在您项目的程序集中做到这一点。我建议你试一试:)
    【解决方案3】:

    将光标放在类或接口类型上

    CTRL + F12

    【讨论】:

    • 请注意,这只适用于 Visual Studio 2015 Update 1 及更高版本。
    • @JokeHuang 它实际上在我的 IDE 中。我试过骑手它也有效。但是您需要在自己的类中实现它。您无法在内置类型中找到它。
    • @BahtiyarÖzdere 实际上,我想找到所有间接实现此接口的类。第三方库类实现了内置接口,我的类继承自第三方类。
    • @JokeHuang 你用的是哪个IDE?
    • @BahtiyarÖzdere VS2019 社区 16.10.2。
    【解决方案4】:

    使用 Visual Studio 2010+

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

    使用 Resharper 7

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
      • @ForceMagic 什么是“答案的基本部分”?这是一个可下载扩展的链接。不过,我会在答案中添加更多解释,谢谢。
      • 终于!虽然我仍然不敢相信 VS 中缺少这个关键功能。
      • @wziska 如您所愿,此功能现在已在 Visual Studio 2015 Update 1 RC 中实现:)
      【解决方案6】:

      对于使用 Visual Studio 2015 的用户,请安装 Visual Studio 2015 Update 1 RC。来自Visual Studio blog

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

      • 转到实施。许多人一直在等待的功能:只需右键单击接口或抽象方法并选择此命令即可导航到实现。

      【讨论】:

      • 这个热键是CTRL + F12
      【解决方案7】:

      我不认为这个功能是内置在 VS 中的,但是 IIRC Resharper 有这个。

      【讨论】:

        【解决方案8】:

        您可以对界面进行正则表达式搜索。

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

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

        【讨论】:

          【解决方案9】:

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

          快捷键:

          1. Ctrl+, (Ctrl+逗号)

          菜单:

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

          好处:

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              如果你使用 resharper ALT + END 快捷键可能有助于找到所有继承者。

              【讨论】:

                【解决方案12】:

                我听说过(我自己没有经验)doxygen 之于 .Net 就像 javadoc 之于 java。

                【讨论】:

                  猜你喜欢
                  • 2010-10-16
                  • 2011-03-08
                  • 1970-01-01
                  • 2015-04-07
                  • 2014-04-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-11-29
                  • 2010-10-29
                  相关资源
                  最近更新 更多