【问题标题】:Is there a way to navigate to real implementation of method behind an interface?有没有办法导航到接口后面的方法的实际实现?
【发布时间】:2011-06-07 11:03:26
【问题描述】:

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

有没有办法/提示(快捷键或任何东西)来访问这个实际的实现?否则,您将不得不添加一些评论,只是为了记住您在哪里实现它,这实际上并不高效且容易出错!

更新:有趣的答案,但我不是很满意,因为一切都很麻烦。我将举一个精确的例子:

IInterface iInterface = someObject;                        
iInterface.someMethod();

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

【问题讨论】:

  • 它怎么知道你想看到哪个实现? (我可以查看类型层次结构以找到所有已知的实现,但这可能是 ReSharper 的一个功能......我不确定。)
  • @supercat:你的意思是在调试时?
  • ReSharper 通过提供一个实现列表来选择它无法检测到特定的实现来实现它。不错的功能,我确实很想念它,因为“查找所有参考”带来了太多东西!
  • 我第一次看到 Jon Skeet 说“我不确定”。对于 SO 中的 C# 问题。
  • @MuthuGanapathyNathan 他可能曾经试图让自己看起来像个人类。

标签: c# .net vb.net visual-studio


【解决方案1】:

我执行以下操作:

1) 右键单击​​方法,点击“查看调用层次结构”(或快捷键Ctrl+K、Ctrl+T)

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

相对快速和容易。烦人的是,虽然界面本身似乎没有等价物。


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


【讨论】:

  • 很好的解决方法。当我没有 Resharper 时,我会坚持这一点
  • 我可以跳过第 1 步。只需从您工作的地方“查看调用层次结构”(或快捷键 Ctrl+K、Ctrl+T),然后一起跳过界面。我在 VS 2013 中。
  • 是否有任何热键来实现峰值?我尝试了 ALT-CTRL-F12 没有成功。 (峰值为 ALT-F12)
【解决方案2】:

使用 VS2013 可以将光标放在方法上,然后使用导航到... (CTRL+,),它将显示声明名称的所有位置。如果不同的接口使用相同的方法名,则效果不佳。

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

【讨论】:

  • 如果您使用的是 resharper,您可以使用 Alt+End。
  • 对我不起作用。我正在使用 VS Express 2013 for Web。
  • 我发现这是最简单的解决方案,无需从键盘上取下您的手。谢谢罗尔夫
  • 这是最快的解决方案。
  • @brechtvhb 您也可以通过自定义命令Edit.NavigateTo 的键盘快捷键将其设置为不带R# 的Alt+End :)
【解决方案3】:

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

Inheritance Margin - Visual Studio Gallery


(来源:microsoft.com

【讨论】:

  • resharper 试用版已在工作中过期,尝试了此扩展程序,效果非常好!谢谢老兄
【解决方案4】:

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

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

【讨论】:

  • 这并没有给出实现。
  • @Robaticus 实际上,确实如此。这不是最方便的方式,但实现将与所有其他参考混合在一起。
  • 这是我现在唯一做的事情,但最重要的是因为我的眼睛不好:)
  • 查找符号的另一种方法是调用层次结构。它具有分组在文件夹结构中的方法:Calls To '...'、Calls From '...' 和 Implements '...'
  • “查找所有引用”的快捷键是Shift + F12
【解决方案5】:

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

我目前在 Ultimate 上运行,没有其他版本可以验证这一点。也就是说,在 Ultimate 中,您可以使用 Architecture Explorer 来查找实现。它比右键单击方法更复杂一些,但它是如何工作的。

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

【讨论】:

  • 我很确定 Architecture Explorer 只是 Ultimate 版,但这会起作用。
  • 非常感谢,我点赞了,但在这种情况下,我想快速更改我的代码。
【解决方案6】:

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

【讨论】:

    【解决方案7】:

    Visual Studio 2015 更新 - Release 1

    您可以将Edit.GoToImplementationCtrl + F12

    一起使用

    它将引导您实现,就像使用 F12 引导您使用非接口方法一样。

    【讨论】:

    • 此快捷方式在带有 typescript 的 vscode 上运行良好。
    【解决方案8】:

    在 2012 Ultimate 中,您可以在解决方案资源管理器中搜索界面。右键单击界面并选择“派生类型”,实现的类将显示在解决方案资源管理器中。不确定它是否适用于快递。

    【讨论】:

    • 没注意到。谢谢。
      现在,如果只有一种方法可以让解决方案资源管理器打开它的树到当前显示的文件,那么我不必先调出编辑器的工具提示来获取文件的路径,以便派生然后导航通过解决方案资源管理器到源文件,我可以在其中确定接口的实现者列表...我认为源代码导航应该成为一个更重要的功能。
    • -- 刚刚发现“Ctrl + ], S”命令将解决方案资源管理器树扩展到当前编辑文档(与活动文档同步)。然后可以扩展生成的文件节点以显示包含的类型,然后可以右键单击这些类型以访问包含“派生类型”命令的上下文菜单。不错。
    • @George,您还可以让 Visual Studio 始终通过工具 -> 选项 -> 项目和解决方案 -> 常规 ->“在解决方案资源管理器中跟踪活动项目”在解决方案资源管理器中跟踪当前打开的文件
    • VS2012 Premium 也有这个功能。在 VS2015 Enterprise 中,此“Derived Types”功能已分为两个功能“Derived Types”和“Implemented By b>',更好的:)
    【解决方案9】:

    对于使用 Resharper 的人来说,按 CTRL + F12 会直接进入类方法!

    【讨论】:

      【解决方案10】:

      这是不可能的。您所描述的内容只有在接口仅限于 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 的go to implementation,它会将您带到接口的声明,因为此时任何IWrite 实现都可以传递到方法中。

      谢天谢地,一些工具(例如 ReSharper)为您提供了查找该方法的所有用法,因此您可以轻松导航到所需的实现。

      【讨论】:

      • ...如果只有一个实现,R# 将直接带您到那里,无需多言。
      • 它不是免费的,但 Visual Studio 也不是。你的时间值多少钱? :)
      • 不是不想付钱,是原则上的:这是很基本的常识性功能,可惜已经付了VS还得再付钱 :)
      • @user310291 虽然我同意你的观点,但为了“惩罚”第三方不提供开箱即用的功能,不购买完全符合你要求的产品,就是割断你的鼻子讨厌你的脸。
      • Resharper 无需显示所有用法即可提供此功能。您可以选择要执行的实现。
      【解决方案11】:

      带有 Update 1 的 Visual Studio 现在实现了此功能!只需右键单击该成员,您应该会在“Go to definition”下看到“Go to implementation”。

      【讨论】:

        【解决方案12】:

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

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

        【讨论】:

          【解决方案13】:

          Visual Studio 只能告诉你它在哪里被引用,但这可能太粗略了。

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

          【讨论】:

            【解决方案14】:

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

            更新

            正如 Jon Skeet 在 cmets 中指出的那样(我在回答之前错过了),我描述的功能可能是 ReSharper 功能......而不是 Visual Studio 功能。

            【讨论】:

              【解决方案15】:

              没有。这是不可能的,尽管 VS 维护了复杂的内存代码结构,但代码导航相当……小气。

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

              【讨论】:

                猜你喜欢
                • 2011-02-10
                • 2015-03-28
                • 1970-01-01
                • 2013-12-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-04-18
                相关资源
                最近更新 更多