让我们考虑以下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 和格式作为响应以及其他公共方法名称。我试图在Roslyn的帮助下生成语义模型,但我没有得到我期望的结果(它可能给了我基本方法调用的名称)。有没有办法找出 Roslyn 的内部方法名称?任何其他解决方案对我也有帮助。
答案 0 :(得分:1)
Body
属性返回类型为BlockSyntax
的实例。您可以在docs中看到此类公开了ChildNodes()
方法。所以:
IEnumerable<MethodDeclarationSyntax> methods = tree.Root
.DescendentNodes()
.OfType<MethodDeclarationSyntax>().ToList();
foreach(var method in methods)
{
Console.WriteLine(method.Identifier);
foreach (var child in method.ChildNodes().OfType<InvocationExpressionSyntax>())
{
Console.WriteLine(child.Identifier);
}
}