我有一些带有源代码的字符串,例如

var newSource = @"
int a = 5;
int b = 10;
Console.WriteLine(a + b);";

我尝试用解析的代码创建BlockSyntax对象
var newTokens = SyntaxFactory.ParseTokens(newSource);
var newBody = SyntaxFactory.Block();
newBody = newBody.InsertTokensAfter(
  newBody.OpenBraceToken, // or newBody.ChildTokens().First()
  newTokens
);

但是方法InsertTokenAfter方法引发System.InvalidOperationException'指定的项目不是列表的元素。'

据我了解,该方法无法在ChildTokens()中找到 token ,但是为什么会发生呢?

.NET Core 1.0.4

最佳答案

InsertTokensAfter方法不适用于添加语句。它仅允许您将标记插入现有的标记列表中(这是仅在声明的修饰符列表中出现在C#语法树中的特定构造)。

语句是节点。您可以使用InsertNodesAfter在语句列表中插入一个或多个节点,但是您必须已经在列表中已有一个语句节点才能执行此操作,并且在您的示例中,您有一个空块,尚无任何语句。

您可以使用block.WithStatements()方法,如果您有语句列表,则直接将其传递给语句列表。不幸的是,没有SyntaxFactory.ParseStatementList方法。

但是,有一个SyntaxFactory.ParseStatement方法,但是该方法仅解析一个语句。幸运的是,块是一个语句。因此,您只需在语句的源周围添加一对大括号,然后将其解析为一个块即可。

var block = (BlockSyntax)SyntaxFactory.ParseStatement("{" + newSource + "}");

09-29 23:40