先说下我想做的事情: 给一个 vs solution,获得某个引用进来的方法在 solution 里的所有调用,进而获取调用时的实参值。
举个例子,假设 solution 的 references 里有 External,现在我想知道 solution 中的代码,每次调用 External.ExternalCallPerson(string personName) 时传进去的 personName 是什么。
我知道 Roslyn 里有一个 API FindCallersAsync,通过这个 API 可以找到对 External.ExternalCallPerson 这个 MethodSymbol 的所有调用,然后再根据调用的位置通过 SyntaxTree 获得实参。
但是这个只能获得直接调用的情况。
如果我的 solution 里有一个
public void InternalCallPerson(string personName, bool isCallTime)
{
if (isCallTime)
{
ExternalCallPerson(personName);
}
}
这个情况下 FindCallersAsync 只会返回 InternalCallPerson 这个方法被定义的位置,而忽略其他方法对它的调用(也就是对 External.ExternalCallPerson 的间接调用)。
该如何通过 Roslyn API 完成我想要的效果?
当然了似乎也可以在把 InternalCallPerson 作为新的目标,再次借由 FindCallersAsync 寻找对它的调用。不过感觉这样好麻烦。最关键的是,由于不知道在更外层的方法是如何层层传参进去的,所以无法获取我实际想要的那个实参值
求大神给指点一二,多谢
最后吐槽一下,Roslyn 的教程略有点少!