查找所有用法树

Find all usages trees

有没有办法找到具有给定深度或具有特定参数类型作为参数的方法的所有用法? 假设有一个class

class MyDeepClass
{
 public void MyDeepMethod() {}
}

我需要用新参数 IMyParameter 扩展它。 但是参数在调用链上方的许多“楼层”处可用,我需要确定所有通向 MyDeepMethod() 的链。

With Find Usages/Find All References命令VS会定位所有的即时调用,例如

class MyClassA
{
 public void Foo()
 {
   obj.MyDeepMethod();
 }
}

class MyClassB
{
 public void Foo()
 {
   obj.MyDeepMethod();
 }
}

其中 obj 属于 MyDeepestClass 的将列出

现在我需要查找这 2 个方法的用法,这会导致更多的用法等等。这呈指数增长。 在某些时候,我最终会得到一些 class 定义了参数。问题是我需要为每条路径单独执行此操作。这非常乏味。 把它想象成一棵树,有最深的方法作为根,包含所需参数的方法(例如 class 字段,或作为参数传递)作为叶子。

所以基本上我正在寻找一些 Find Usages Advanced 命令 “找到所有直接或间接导致 MyDeepClass 的 MyDeepMethod 的顶级方法,并将 IMyParameter 定义为参数或 class 字段”:

A->B->C->MyDeepMethod D->MyDeepMethod E->F->B->C->MyDeepMethod

或者至少“找到具有 MyDeepMethod 给定深度的所有用法”。

Alexander Kurakin感谢您的评论。 这个问题的答案是 ReSharper |检查 |来电。

在这种情况下,Incoming Calls 功能可以帮助您。它可以帮助您查看和浏览代码中的调用链。 让我们考虑一下这段代码:

class MyDeepClass
{
    public void MyDeepMethod() { }
}
class MyClassA
{
    MyDeepClass obj;
    public void Foo()
    {
        obj.MyDeepMethod();
    }
}

class MyClassB
{
    MyDeepClass obj;
    public void Foo()
    {
        obj.MyDeepMethod();
    }
}
class Program
{
    public static void Main(string[] args)
    {
        new MyClassB().Foo();
    }
}

MyDeepMethod声明中调用ReSharper | Inspect | Incoming Calls,你会得到如下的调用树

顺便说一句,如果您最终决定向 MyDeepMethod 方法添加参数,您可以获得 ReSharper 帮助来帮助您更新 whole call tree。 在MyDeepMethod方法声明上调用Change Signature重构(ReSharper | Refactor | Change Signature)并在对话框中添加新参数:

然后点击下一步 | Select Resolve with call tree 意见在这里 |单击下一步

你会得到一步一步的帮助来解决整个调用树