1

我正在尝试从小段代码动态构建 ac# 类。我们有一个窗口,用户可以在其中输入 c# 代码(有效或无效),我们将这些字符串解析为 roslyn。我最近在使用这个时发现了一个问题:

public override IEnumerable<StatementSyntax> GenerateStatements()
{
    var result = new List<StatementSyntax>();
    if (!string.IsNullOrWhiteSpace(this.Tag.Code))
    {
        result.Add(SyntaxFactory.ParseStatement(this.Tag.Code));
    }

    return result;
}  

结果在VB中编译时,如果语句是多行的,它将内联所有文本,即使在c#中也是如此。

然后我创建了一个帮助类将其解析为一个虚拟类和方法以获取已解析语句的列表。

public override IEnumerable<StatementSyntax> GenerateStatements()
{
    var result = new List<StatementSyntax>();
    if (!string.IsNullOrWhiteSpace(this.Tag.Code))
    {
        foreach (var statement in SyntaxFactoryHelper.ParseStatements(this.Tag.Code))
        {
            result.Add(statement);
        }
    }

    return result;
}

public static StatementSyntax[] ParseStatements(string code)
{
    var blockCode = string.Format(CultureInfo.InvariantCulture, "public class C {{ public void M() {{ {0} }} }}", code);
    var compilationUnit = SyntaxFactory.ParseCompilationUnit(blockCode);
    return compilationUnit
        .ChildNodes().OfType<ClassDeclarationSyntax>().First(c => c.Identifier.Text == "C")
        .ChildNodes().OfType<MethodDeclarationSyntax>().First(m => m.Identifier.Text == "M")
        .ChildNodes().OfType<BlockSyntax>().First()
        .Statements.ToArray();
}

这是我的问题。

如果我的应用程序中有 3 个语句。

for (var i = 0; i < 10; i++)
{

然后

i.ToString()

最后

}

它会自动关闭第一条语句的花括号,因此我失去了作用域。

有没有办法解析无效代码并避免这种行为?

我知道内联代码在 c# 中是有效的,但是我们在 VB 中面临同样的问题。

谢谢你的帮助 :)

4

0 回答 0