查找给定 C# 方法的可能"callee tree"的策略



假设我有一个方法a,它可以根据某个条件调用方法B或C(它会针对一个条件调用B方法,针对另一个条件则调用C方法(。现在,假设B可以调用方法D或E(同样,基于不同的条件(,而C可以调用F或G(基于不同的情况(。

想象一下,我有一个这样的"被叫树",但树很大。我想知道那棵树是什么(即方法列表(,而不必手动遵循每一条可能的路径。手动操作将耗时且容易出错。

我正在寻找的是一种策略或工具,可以快速地将这些信息提供给我。我见过一些第三方工具,但它们看起来有点重,我不确定它们是否会做到这一点。

我正在使用C#和Visual Studio 2017。

如果这真的是一次性的事情,并且您不介意修改所有方法,那么这样的事情可能会有所帮助。您可以编写一个实用程序函数来获得当前方法的名称,如下所示:

[MethodImpl(MethodImplOptions.NoInlining)]
public static string GetCurrentMethod()
{
var st = new StackTrace();
var sf = st.GetFrame(1);
return sf.GetMethod().Name;
}

并从所有要跟踪的方法中调用GetCurrentMethod()。根据您描述的方法层次结构,它看起来像这样:

static void A(int num)
{
Console.Write(GetCurrentMethod() + " -> ");
if (num > 0)
B(num);
else
C(num);
}
static void B(int num)
{
Console.Write(GetCurrentMethod() + " -> ");
if (num < 5)
D(num);
else
E(num);
}
static void C(int num)
{
Console.Write(GetCurrentMethod() + " -> ");
if (num < -10)
F(num);
else
G(num);
}
static void D(int num)
{
Console.WriteLine(GetCurrentMethod() + " -> ");
}
static void E(int num)
{
Console.WriteLine(GetCurrentMethod() + " -> ");
}
static void F(int num)
{
Console.WriteLine(GetCurrentMethod() + " -> ");
}
static void G(int num)
{
Console.WriteLine(GetCurrentMethod() + " -> ");
}

这是一个我打印到控制台的简单示例,但您可以修改它以写入文件。为了跳到新行,我在这里的"leaf"方法中使用了WriteLine(),但这些都是可以根据方法层次结构来计算的。

现在,通过几个符合我条件的示例数字,我可以得到所有可能的树:

呼叫:

A(-11);
A(-5);
A(0);
A(4);
A(7);

输出:

A->C->F->

A->C->G->

A->C->G->

A->B->D->

A->B->E->


编辑

你可能可以这样做,以避免担心给出所有正确的初始条件,然后最终从最终输出中删除重复项:

for (int i = -15; i < 15; i++)
{
A(i);
}

最新更新