我可以使用 Roslyn 来完成此 C# 语法转换吗?

Can I use Roslyn to accomplish this C# syntax transformation?

关于使用 Roslyn 添加 C# 语法糖的两部分问题:

首先,是否可以使用 Roslyn 向 C# 添加新语法,或者它是否始终必须是从有效 C# 到其他有效 C# 的转换?例如,我想做类似 VB.NET 的 XML 文字:

XElement lvalue = <some><xml /></some>;

是否可以在编译时将其转换为:

XElement lvalue = new XElement("some", new XElement("xml")); // or whatever

其次,如果可能的话,它对用户来说是什么样的?我可以这样做以便编写第一个表达式,并且永远不会看到到第二个表达式的转换(它在编译时透明地发生)吗?还是 Roslyn 语法转换必须以 IDE "refactoring suggestion" 的形式出现?我不清楚 Roslyn 文档中的这一点。

如果它必须查看您提供的代码片段,则不会(无需解决一些更大的问题),但是您可以采用与 Whosebug went with for localisation

类似的方法

你可以引入类似 _x("<some><xml /></some>") 的东西,你不会在语法方面得到太多好处(因为你可以有一个运行时方法来解析它),但你可以让 Roslyn 承担替换的工作它带有您希望它生成的确切代码。

First, is it possible using Roslyn to add new syntax to C#

没有。

or does it always have to be a transformation from valid C# to other valid C#?

是的。

Roslyn 是一个 C#/VB 分析引擎;这些是它分析的唯一语言。它 而不是 用于扩展 C# 或 VB 语言。

C# 编译器在相当宽松的许可下开源。如果你想编写你自己的版本,你当然可以 fork 存储库并让解析器做任何你喜欢的事情。