如何确定在switch语句中的当前情况?

3

是否有可能确定当前正在评估哪个案例?就像这个示例代码:

const int one = 1;
const int two = 2;

int current_num = 1;

switch (current_num){
       case one:
       case two:
           WriteLine(current_case) //outputs 'one'
           break;
}

我相信我可以使用字典或其他东西来查找current_num,一旦我开始WriteLine,但可能有一种内置的方法可以获取当前正在评估的案例的名称。

编辑:简短的答案是不可能的。查看JonSkeet的答案以获取可能的替代方案。


1
这不是有效的 C# 语言,因为 case 表达式只能是常量。我认为你试图做一些真正不存在的事情... - Jon Skeet
@Alxandr:如果你用1代替“one”,那么为什么不直接使用WriteLine(current_num)呢?目前还不清楚OP想要实现什么-我已经发布了一个可能有帮助的答案,但我们确实需要更多的明确性。 - Jon Skeet
@JonSkeet 编辑了 OP 以使其成为有效的 C# 代码。我试图尽可能简化代码,但可能有些过头了。我有一个 for 循环,遍历数据库中的所有项,大约有 20 万个,为了节省编写代码的时间(最多节省 2 分钟),我想在当前 switch case 中使用 Trace.WriteLine("saving at current checkpoint"),作为某种检查点来保存对数据库的更改。所以 one 实际上是 25049,而 two55023。我想原问题的答案是“不可能”,谢谢。 - TankorSmash
@TankorSmash:那你实际上想输出什么?如果基本上是从数字到字符串的映射,那么可以使用Dictionary<int, string> 或者使用我在答案中建议的枚举方法。 - Jon Skeet
我想要输出案例名称。类似于System.ReflectionGetField,可以使用GetCase来实现。但如果不可能的话,你提供的答案也非常有帮助。 - TankorSmash
显示剩余5条评论
1个回答

6

我不太清楚你想要做什么,但我猜测使用枚举会更好:

enum Foo {
    One = 1,
    Two = 2,
    Three = 3
}

...

int someValue = 2;
Foo foo = (Foo) someValue;
Console.WriteLine(foo); // Two

您仍然可以在case语句中使用这个函数:

switch (foo) {
    case Foo.One:
    case Foo.Two:
        Console.WriteLine(foo); // One or Two, depending on foo
        break;
    default:
        Console.WriteLine("Not One or Two");
}

想法是获取当前断点范围的所有案例实例;返回一个 [One,Two] 数组。 - H3sDW11e
1
@H3sDW11e:好吧,答案已被接受(9年前),因此可能满足了提问者的需求... - Jon Skeet

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