【问题标题】:How to parse all public method names and method calls inside a method body of a C# class?如何解析 C# 类的方法体内的所有公共方法名称和方法调用?
【发布时间】: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);
}

此代码响应方法名称为 EvaporateSpeak。现在我想找出公共方法中的方法名称/调用,例如:我也想找出 WriteLineFormat 作为响应以及其他公共方法名称.我试图在 Roslyn 的帮助下生成语义模型,但没有得到我所期望的(它可能给了我基本方法调用的名称)。有没有办法用 Roslyn 找出内部方法名称?任何其他解决方案也对我有帮助。

【问题讨论】:

  • 如果你想在方法体中声明方法,那么你应该研究DescendantNodes.Body属性。这都在docs
  • @MarkBenningfield 感谢您的建议。 MethodDeclarationSyntax.Body 回复方法体本身。但是我没有找到任何方法来解析来自该方法体的方法调用。我是罗斯林的菜鸟,所以我肯定在这里错过了一些东西。
  • 您正在寻找调用表达式语法节点;)

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


【解决方案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);
  }
}

【讨论】:

  • 你还需要后代节点。
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多