我有一些带有源代码的字符串,例如
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 核心 1.0.4
最佳答案
InsertTokensAfter 方法不适用于添加语句。它只允许您在现有的标记列表中插入标记(这是 C# 语法树中仅在声明的修饰符列表中出现的特定构造)。
语句是节点。您可以使用 InsertNodesAfter 在语句列表中插入一个或多个节点,但是您必须在列表中已经有一个现有的语句节点才能执行此操作,并且在您的示例中,您有一个空 block ,其中还没有任何语句。
如果您有一个语句列表,您可以使用 block.WithStatements() 方法,直接将一个语句列表传递给它。不幸的是,没有 SyntaxFactory.ParseStatementList 方法。
然而,有一个 SyntaxFactory.ParseStatement 方法,但它只解析一个语句。幸运的是, block 是一个语句。因此,您只需在语句的源代码周围添加一对大括号,并将其作为一个 block 进行解析。
var block = (BlockSyntax)SyntaxFactory.ParseStatement("{" + newSource + "}");
关于c# - 从字符串创建 BlockSyntax (Roslyn),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45267846/