如何快速查找接口方法的实现?

72

有没有一种快速的方法可以找到接口方法/属性等的所有实现,而不是引用?这是一些示例代码:

public class SomeClass : IBaseClass
{
  public Int32 GetInt()
  {
     return 1;
  }
}

public interface IBaseClass
{
  public Int32 GetInt();
}

public class SomeOtherClass
{
  IBaseClass _someClass;
  private TestMethod()
  {
    _someClass = new SomeClass();
    _someClass.GetInt();
  }
}

我想在审查SomeOtherClass.TestMethod()时快速到达SomeClass.GetInt()。 如果我右键单击_someClass.GetInt()并单击“转到定义”,它会带我到接口。 如果我点击“查找所有引用”,我可能会看到使用GetInt()方法的所有用途列表…而不仅仅是实现GetInt()方法的类。

有没有更快的方法找到这个地方?其他开发者有什么技巧吗?我们大多数依赖项都使用D.I.,这意味着跟踪深嵌套的代码需要很长时间。


1
使用Shift + F12显示所有引用,包括定义。 - Akira Yamamoto
6个回答

122

由于我不喜欢在编码时使用鼠标,所以我通常会:

  • 将光标移到方法上
  • 键入ctrl+k clrl+t以打开调用层次结构窗口
  • 向下移动到实现节点。
  • 键入Return以转到所选实现

据我所知,这是找到方法实现的最快方法,没有ReSharper。

(顺便说一句:您可以使用相同的系统从类方法实现移动到相应的接口声明:只需选择根)


你需要 VS2010 对吧? - Constantin
1
@Arialdo Martini:绝对完美! - JAN
11
我认为你不需要第二个Ctrl键,也就是说Ctrl-K和T应该可以使用。 - EzaBlade
1
只是为了澄清一下;要查看“实现”节点,需要从_interface_中的成员定义调用调用层次结构。 - Rae
在Mac上的VS怎么样? - mr5

24

我相信在 ReSharper 中可以使用 Alt-End 完成此操作。


17
哎呀,每位开发者需要支付349美元。这就是我们购买VS2008专业版所付出的费用。 - Beep beep
12
您没有要求ReSharper的销售宣传,而您所赚取的钱与我们无关,但请考虑一下通过您当前的工作所获得的收入,并考虑一下您能够多快地收回这个授权费用。如果数字是正确的,那么350美元值得投资。为了让您更清楚一些,我会说,在实际上花一个月的时间学习ReSharper的各种技巧(当然,我仍在学习一些),同时进行工作时,该工具至少可以将我作为代码作者的生产力提高30%(实际上可能更高,但我不想夸大其词)。 - lance
5
我同意,任何拒绝购买ReSharper(即使是仅C#版也更便宜)的公司都是傻瓜,因为你浪费的时间会让公司损失成千上万美元。我也同意Lance的观点,ReSharper的成本可以在一个月内轻松收回。 - Chris Marisic
3
过去我有一些使用过它。虽然我发现在重构方面它很有用(但我并不经常这样做),但我并没有发现它让我更加高效。我承认我没有花太多时间学习其“门道”,但当我们唯一的问题是找到已实现接口时,很难为我证明其价值。 - Beep beep
4
同意!我不在意你赚了多少钱,但你必须经常使用“转到实现”功能才能从该功能中收回许可费! :) - lance
此外,现在Ctrl-Alt单击将带您到实现:https://dev59.com/tmIj5IYBdhLWcg3waEZe#21461161 - lance

9

如果没有使用ReSharper,最好的方法是:

查找文件(Ctrl+Shift+F) 查找内容:“class*ISomeClass” 查找选项:“使用通配符”

这将找到所有的实现,然后您可以在具体的实现中搜索您的函数。


2
感觉很奇怪看到 ISomeClass,我们通常以'I'开头来命名接口而不是类...但这只是我们的习惯。 - Marvin Thobejane

3

这个插件是为CodeRush设计的,而且似乎CodeRush的免费版本已经停止了。 - Constantin
1
CodeRush Xpress看起来非常活跃 http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/ - Miha Markic
CodeRush Xpress不支持vs2013。 - Ronnie
链接不可用。 - Sirop4ik

2
如果您的接口与您通常要导航到的具体模型位于同一库中,您可以向具体对象添加“使用别名”。无论如何,“使用”都是助手,这有助于简化操作。
using System;
using PrimaryImplementation = YourNamespace.YourConcreteObject;


public interface IYourInterface{

}

当你进入界面时,有一种快速(而且简单粗暴)的方式可以直接进入你的界面主要实现。按F12->F12!


1

R#在弹出菜单上有一个“转到实现”选项,这对于编程非常方便。


听起来很不错,你知道 VS 中有没有类似的东西吗? - Beep beep
除了您已经提到的“查找引用”之外,不要超出范围。如果您不了解R#,我真的鼓励您去了解一下。除了这样的功能之外,它还具有有用的编码提示和非常强大的重构功能集。 - Brian Rasmussen
R#不是完全不同的编程语言吗?还是说有一个R# IDE呢?我们正在构建一个ASP.NET MVC应用程序... - Beep beep
R# 是 Resharper 的简称。它是 Visual Studio 的插件,为其添加了许多实用的命令。 - Brian Rasmussen
啊!我刚才谷歌了一下R#,找到了这个(http://sourceforge.net/projects/r-sharp/)。显然我不太熟悉这个术语 =) - Beep beep

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