如何解析C#类的方法体内的所有公共方法名称和方法调用?

时间:2018-03-31 00:56:08

标签: c# parsing roslyn roslyn-code-analysis

让我们考虑以下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 的内部方法名称?任何其他解决方案对我也有帮助。

1 个答案:

答案 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);
  }
}