【发布时间】:2018-04-01 03:27:49
【问题描述】:
让我们考虑以下 C# 代码示例:
public class Person
{
public string Name { get; private set; }
public Person(string name)
{
Name = name;
}
public void Evaporate()
{
Console.WriteLine("Hello World");
}
public string Speak()
{
string str = "test";
return string.Format("Hello! My name is {0}", Name);
}
}
我想从此源代码中提取所有方法/API 调用名称。使用 Roslyn,在以下代码的帮助下,我可以检索在类 Person 中声明的公共方法名称。
IEnumerable<MethodDeclarationSyntax> methods = tree.Root
.DescendentNodes()
.OfType<MethodDeclarationSyntax>().ToList();
foreach(var method in methods)
{
Console.WriteLine(method.Identifier);
}
此代码响应方法名称为 Evaporate 和 Speak。现在我想找出公共方法中的方法名称/调用,例如:我也想找出 WriteLine 和 Format 作为响应以及其他公共方法名称.我试图在 Roslyn 的帮助下生成语义模型,但没有得到我所期望的(它可能给了我基本方法调用的名称)。有没有办法用 Roslyn 找出内部方法名称?任何其他解决方案也对我有帮助。
【问题讨论】:
-
如果你想在方法体中声明方法,那么你应该研究
DescendantNodes的.Body属性。这都在docs -
@MarkBenningfield 感谢您的建议。 MethodDeclarationSyntax.Body 回复方法体本身。但是我没有找到任何方法来解析来自该方法体的方法调用。我是罗斯林的菜鸟,所以我肯定在这里错过了一些东西。
-
您正在寻找调用表达式语法节点;)
标签: c# parsing roslyn roslyn-code-analysis