我们正在用 roslyn 编写代码生成器。除其他事项外,用户应该能够指定方法主体的单个语句或属性的 getter/setter 主体。因此,他将字符串列表传递给翻译方法。当将单个花括号作为语句传递时,右括号会以某种方式被吞掉。
方法:
internal static SyntaxList<StatementSyntax> GetSyntaxListOfStatementSyntaxs(IEnumerable<string> statements)
{
if (statements.Any())
{
var statementSyntaxs = statements.Select(s => Syntax.ParseStatement(s));
return Syntax.List(statementSyntaxs);
}
return Syntax.List<StatementSyntax>();
}
输入:
var list = new List<string>
{
"if (this.field != null)",
"{",
"this.field = new MyType();",
"}",
"return this.field;"
};
SyntaxList 将用于新方法声明(最后一个参数):
var methodDeclarationSyntax = Syntax.MethodDeclaration(
Syntax.List<AttributeDeclarationSyntax>(),
Syntax.TokenList(),
Syntax.IdentifierName("MyType"),
null,
Syntax.Identifier("MethodIdentifier"),
null,
Syntax.ParameterList(),
Syntax.List<TypeParameterConstraintClauseSyntax>(),
Syntax.Block(statementSyntaxList));
我还尝试单独处理单个右大括号,但我没有设法创建一个只有一个右大括号的语句。
奇怪的是,单个左大括号被解析为语法块(正确与否),但手动创建该语法块似乎是不可能的。既不用于开口,也不用于闭合支架。
我不想添加对这些语句的自定义解析,因为我们决定让 Roslyn 摆脱解析任务。有人知道如何处理这些特殊声明吗?或者也许有人可以用另一种方法来处理这个问题。任何帮助表示赞赏。提前致谢。