我试图从小块代码中动态构建一个c#类。我们有一个窗口,用户可以输入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中面临同样的问题。
感谢您的帮助:)