用roslyn扩展c#语法

时间:2016-08-05 09:53:48

标签: c# roslyn

我正在尝试在没有else的情况下实现“return if”/“return value if”,因为我只想在条件有效时返回或返回值。

我知道,有if (condition) return;if (condition) return value;,但我想让代码更清晰一点,因为它更具可读性,所以拥有这种语法会很好。

我听说过roslyn这是可能的,并在这里回答问题:Is there a way to implement custom language features in C#?但我不知道如何实现它。

所以代码就是这样:

public class Testclass
{
    public static void Main(String[] args)
    {
        Testclass t = new Testclass();
        t.TestMyClassWithVoid();
        bool success = t.TestMyClassWithInt(3) == 3;
        bool fail = t.TestMyClassWithInt(2) == 2;
    }

    public void TestMyClassWithVoid()
    {
        int value = GetValueFromSomeWhere();
        return if value == 3;

        DoSomeOtherStuffSinceValueIsNotThree();
    }

    public int TestMyClassWithInt(int value)
    {
        return value if value == 3;

        DoSomeOtherStuffSinceValueIsNotThree();
        return -1;
    }
}

任何想法我怎么能解决这个问题?我开始尝试使用Roslyn.Compilers.CSharp - 命名空间,但我不知道如何开始实现。

2 个答案:

答案 0 :(得分:1)

如果您可以为此生成正确的IL,这应该可行。 因为这不是一个新的CLR功能,所以你不需要做点网核,只需要Roslyn。

要做到这一点,你有两个选择,

一种方法是按原样保留Roslyn并将新语法重写为相应的C#语法,然后按常规编译。

第二个选项,因为Roslyn是一个开源的,就是添加了将新语法编译到自己的Roslyn并使用它编译代码的能力。

答案 1 :(得分:0)

这是一个替代建议,可能适用于正在寻找扩展点到roslyn的人。它甚至可以作为nuget包提供!为您的语法创建分析器和代码修复提供程序。

基本上你会得到的是你选择的任何语法下的红色波浪线,并带有自动修复提示,可以让你将它转换为常规的C#等效物。

它还可以用于验证库的使用情况,检查正确的属性是否在正确的位置,检测常见的代码气味等。

在这篇文章中阅读有关代码分析器的更多信息:https://msdn.microsoft.com/en-us/magazine/dn879356.aspx

该链接的快速摘要(但绝不是替代):

  • 安装VS SDK,Roslyn SDK,编译器平台SDK
  • 创建新项目:使用Code Fix(NuGet + VSIX)模板进行分析。
  • 有关如何创建分析器/代码修复提供程序的3个示例
  • 将VSIX项目设置为启动项目并运行