如何解析C#类的方法体中的所有公共方法名和方法调用? 让我们考虑下面的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); } }

如何解析C#类的方法体中的所有公共方法名和方法调用? 让我们考虑下面的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); } },c#,parsing,roslyn,roslyn-code-analysis,C#,Parsing,Roslyn,Roslyn Code Analysis,从这个源代码中,我想提取所有的方法/API调用名。使用Roslyn,在以下代码的帮助下,我可以检索类Person中声明的公共方法名 IEnumerable<MethodDeclarationSyntax> methods = tree.Root .DescendentNodes() .OfType<MethodDeclarationSyntax>().ToList(); foreach(var method in methods) { Conso

从这个源代码中,我想提取所有的方法/API调用名。使用Roslyn,在以下代码的帮助下,我可以检索类Person中声明的公共方法名

IEnumerable<MethodDeclarationSyntax> methods = tree.Root
    .DescendentNodes()
    .OfType<MethodDeclarationSyntax>().ToList();

foreach(var method in methods)
{
    Console.WriteLine(method.Identifier);
}
IEnumerable方法=tree.Root
.degentNodes()的
.OfType().ToList();
foreach(方法中的var方法)
{
Console.WriteLine(方法标识符);
}

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

Body属性返回类型为
BlockSyntax
的实例。从中可以看到,此类公开了一个
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);
  }
}
IEnumerable方法=tree.Root
.degentNodes()的
.OfType().ToList();
foreach(方法中的var方法)
{
Console.WriteLine(方法标识符);
foreach(类型()的方法.ChildNodes()中的var child)
{
Console.WriteLine(子标识符);
}
}

如果希望在方法体中声明方法,则可能应该研究
子代节点的
.body
属性。这些都在@MarkBenningfield中,谢谢你的建议。MethodDeclarationSyntax.Body回复方法体本身。但我没有找到任何方法来解析来自该方法体的方法调用。我是Roslyn的noob,所以我肯定错过了一些东西。您正在查找invocationexpressionsyntax节点;)您还需要子代节点。