使用Roslyn扩展C#语法

9

我想实现一种“如果返回”/“如果返回值”的功能,没有else语句,因为我只想在条件成立时返回或返回一个值。

我知道,有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命名空间,但我不知道如何开始实现。


我从你的代码中理解到,“return if value == 3;” 的意思是,如果值为3,则不想运行该方法的其余代码,对吗? - Ankit
1
@AnkitkumarBhatt 是的!就像 if(value == 3) return; 但是反过来。 - Matthias Burger
你可以在标签中使用goto,只需将goto放置在if条件语句内部即可。我认为这种方式可以解决你的问题。 - Ankit
@AnkitkumarBhatt 所以我也可以使用合法的 if(value == 3) return; 语法 - 比在C#中使用 goto 更高效且更美观。 - Matthias Burger
@AnkitkumarBhatt 是的,那会起作用。 - Matthias Burger
显示剩余3条评论
2个回答

1
这里有一个替代建议,适用于想要扩展 Roslyn 的人。它甚至可以作为 NuGet 包提供!创建一个语法分析器和代码修复程序。
基本上,您会在所选择的任何语法下得到一个红色波浪线,并带有自动修复提示,让您将其转换为常规的 C# 等效语法。
它还可以用于验证库的使用情况,检查正确的属性是否位于正确的位置,检测常见的代码问题等。
请在此文章中了解更多关于代码分析器的信息:https://msdn.microsoft.com/en-us/magazine/dn879356.aspx 该链接的快速摘要(但绝不是替代品):
  • 安装 VS SDK、Roslyn SDK 和编译器平台 SDK
  • 创建新项目:使用“Analyzer with Code Fix(NuGet + VSIX)”模板。
  • 将有 3 个示例说明如何创建语法分析器/代码修复程序
  • 将 VSIX 项目设置为启动项目并运行

1
如果你能生成正确的IL代码,这个应该可以工作。因为这不是一个新的CLR功能,所以你不需要在dot net core上做任何事情,只需要用Roslyn就行了。
你有两个选择:
第一个选择是保留Roslyn,并将你的新语法重写为相应的C#语法,然后像平常一样编译。
第二个选择,由于Roslyn是开源的,你可以添加能够编译你的新语法的能力到你自己的Roslyn中,并使用它来编译你的代码。

我选择了第二个选项,最终在上周末让它正常工作了。谢谢! - Matthias Burger
2
你能详细说明一下“将您的新语法重写为相应的C#语法并编译为常规代码”是什么意思吗?您是否指使用Roslyn进行此操作?我正在尝试找出是否可以以透明的方式(即不会显示为某种IDE建议,而是在编译时透明地进行转换)使用Roslyn来完成这个过程。 - user1454265
@user1454265 我的意思是你可以写任何你想要的代码,但在编译之前,你需要将代码转换为有效的C#代码。你可以使用Roslyn Code Fix或单独的进程来完成这个过程。但据我所知,你可以将它集成到VS构建过程中。 - Dudi Keleti
我需要在C#中使用可选引用,以便我们可以将一个拥有数百万行代码的VB.net项目转移到C#。目前这正阻止着我们进行迁移,因此在后台透明地重写可选引用为合法的C#代码的可能性非常吸引人。 - Brain2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接