先说下我想做的事情: 给一个 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 的教程略有点少!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.