C#-Roslyn:为什么字符串到MethodDeclarationSyntax的代码转换会出现异常

C#-Roslyn:Why the code conversion of the string to MethodDeclarationSyntax presents an exception

我的代码:

stringBuilder.AppendLine("}");
MethodDeclarationSyntax methodDeclaration = default;
var tmp = CSharpSyntaxTree.ParseText(stringBuilder.ToString())
                          .GetRoot()
                          .DescendantNodes();


var list = tmp.OfType<MemberDeclarationSyntax>();

foreach (var item in list)
{
    Console.WriteLine(item.NormalizeWhitespace().ToFullString());

    methodDeclaration = item as MethodDeclarationSyntax;

    if (methodDeclaration != null)
        break;
}
if (methodDeclaration is null)
    throw new Exception("No create Roslyn ...");
return methodDeclaration;

字符串输出应该没有问题:

public void T1()
{
    Console.WriteLine("666");
}

但是无法转换为MethodDeclarationSyntax,我该如何解决这个问题?

恐怕我可能会误解你想要达到的目标: 阅读您的代码,我假设您想找到第一个 method declared in a given SourceText.

您提供的 SourceText 不包含 MethodDeclarationSyntax!

CSharp代码

public void T1()
{
    Console.WriteLine("666");
}

是一个GlobalStatementSyntax, containing a LocalFunctionStatementSyntax.

为了使 T1 成为 MethodDeclarationSyntax,您需要将其放入 Type 中,例如 classstructinterface:

class C
{
    public void T1()
    {
        Console.WriteLine("666");
    }
}

但是,您的程序现在会在终止循环之前将整个 Class 和包含的方法打印到控制台,因为 SyntaxNodes are of type MemberDeclarationSyntax:

  • void T1() 是您期望的 MethodDeclarationSyntax 类型
  • class CClassDeclarationSyntax 类型,派生自 MemberDeclarationSyntax 因为它可以嵌套在另一个 class

我看到您正在使用 Visual Studio。在学习 Roslyn 和 CSharpSyntaxTree 时对我帮助很大的是(现在仍然是)Syntax Visualizer.