C# 使用Roslyn CTP分析单个右大括号的奇怪行为

C# 使用Roslyn CTP分析单个右大括号的奇怪行为,c#,.net,curly-braces,roslyn,C#,.net,Curly Braces,Roslyn,我们正在和roslyn一起编写代码生成器。除此之外,用户应该能够指定方法体的单个语句或属性的getter/setter体。因此,他将字符串列表传递给翻译方法。当将单个大括号作为语句传递时,右大括号不知何故被吞没了 方法: internal static SyntaxList<StatementSyntax> GetSyntaxListOfStatementSyntaxs(IEnumerable<string> statements) { if (statement

我们正在和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>();
}
内部静态SyntaxList GetSyntaxListofStatementSyntax(IEnumerable语句)
{
if(statements.Any())
{
var statementSyntaxs=statements.Select(s=>Syntax.ParseStatement);
返回Syntax.List(statementSyntaxs);
}
返回Syntax.List();
}
输入:

var list = new List<string>
{
    "if (this.field != null)",
    "{",
    "this.field = new MyType();",
    "}",
    "return this.field;"
};
var list=新列表
{
“如果(this.field!=null)”,
"{",
“this.field=new MyType();”,
"}",
“返回此。字段;”
};
SyntaxList将用于新的方法声明(最后一个参数):

var methodDeclarationSyntax=Syntax.MethodDeclaration(
Syntax.List(),
Syntax.TokenList(),
Syntax.IdentifierName(“MyType”),
无效的
Syntax.Identifier(“MethodIdentifier”),
无效的
Syntax.ParameterList(),
Syntax.List(),
Block(statementSyntaxList));
我还试图分别处理单个右大括号,但我没有创建一个只有一个右大括号的语句

奇怪的是,单个大括号被解析为语法块(正确与否),但似乎无法手动创建该语法块。既不适用于开口支撑,也不适用于闭合支撑


我不想添加这些语句的自定义解析,因为我们决定让Roslyn不需要解析任务。有人知道如何处理这些特殊声明吗?或者有人可以用另一种方法来处理这个问题。谢谢你的帮助。提前感谢。

问题在于,开始大括号和结束大括号都不是语句,因此您无法将它们作为语句进行解析

Roslyn甚至试图解析无效的代码,这就是为什么在解析
{
时会得到
块语法的原因。但它是一个不完整的块,缺少右括号

我认为您应该立即解析整个方法体,您可以通过将行连接到一个字符串中并添加一个大括号和一个大括号来完成

因此,实际解析为语句的字符串如下所示:

{
if (this.field != null)
{
this.field = new MyType();
}
return this.field;
}

我想确保
…new MyType();}
末尾的大括号是故意的。谢谢。我纠正了这个错误。在C#中,整个块是一个语句,但开大括号或闭大括号本身不是。谢谢svick。考虑到你的答案,我想出了一个解决办法。然而,重新思考允许用户传递任意字符串的方法是处理语句的一种糟糕的方式。最好直接传递语句并在内部验证它们。不幸的是,我找不到检查有效语句语法的简单方法。
{
if (this.field != null)
{
this.field = new MyType();
}
return this.field;
}