在 Roslyn 中解析嵌入式表达式

Parsing embedded expressions in Roslyn

我正在尝试为类似 QML 的标记语言编写解析器,我希望在标记中允许 C# 表达式。所以一个例子可能是这样的:

ClassName {
    Property1: 10
    Property2: Math.Sqrt(123)
    Property3: string.Format("{0} {1}", "Hello", "World")
}

(这也有点像 ASP.NET 的 Razor 引擎,但 afaics Razor 不使用 Roslyn?)

我该怎么做?我只想解析一个表达式,无论是文字、方法调用、lambda 等。我试过使用 CSharpSyntaxTree.ParseText 但它需要一个完整的文件,我找不到任何文档似乎与此用例相关。

您需要调用 CSharpSyntaxTree.ParseText(),并使用 SourceCodeKind.Interactive 传递 CSharpParseOptions,这允许顶级表达式。

看起来这个功能在 Roslyn 的一些预览版本中可用,但同时在 1.0 版本中被搁置了​​。

交互式 (REPL) 和脚本支持计划在 1.1 中回归,如 interactive design meeting notes@github.

中所示

编辑: 事实上,在 latest pre-release NuGet package 中,再次可以将 SourceCodeKind.Interactive 传递给 ParseText

SyntaxFactory.ParseExpression() 对我有用。