c# - 从字符串创建 BlockSyntax (Roslyn)

标签 c# .net-core roslyn

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

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/

相关文章:

c# - 在泛型方法中访问对象的属性

c# - 以编程方式删除 Azure 应用程序注册 API 权限

C# 闭包堆分配发生在方法开始时

c# - 使用 SyntaxRewriter 删除代码中的冗余分号

c# - 如何在最终用户预览中使用 Roslyn 执行脚本

c# - 我应该使 C# 私有(private)方法通用吗?

c# - (很多)内部方法是可以避免的吗? (接口(interface)、工厂模式)

javascript - 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

.net-core - 创建一个包含 3 个表中的列的 View

c# - 在服务器端c#读取grpc中的元数据