如何在C#或Java中找到每个开关案例项的值?

如何在C#或Java中找到每个开关案例项的值?,java,c#,switch-statement,case,Java,C#,Switch Statement,Case,比如说,我有: string myString = "hello"; switch (myString) { case "hello": break; case "goodbye": break; } 现在我需要一个方法或一段代码,它将检索所声明的每个案例的值 例如,我想输出“hello”和“再见”,有没有办法获得这些值 我在寻找这样的东西(假设): //我希望输出结果如下所示: System.out.println("hello") System.out.println("goodbye"

比如说,我有:

string myString = "hello";

switch (myString) {
case "hello":
break;
case "goodbye":
break;
}
现在我需要一个方法或一段代码,它将检索所声明的每个案例的值

例如,我想输出“hello”和“再见”,有没有办法获得这些值

我在寻找这样的东西(假设):

//我希望输出结果如下所示:

System.out.println("hello")
System.out.println("goodbye")
作为foreach循环的结果。这样的事情可能吗

谢谢,

在C#中(Java的答案可能完全不同……我认为使用这两个标记是不好的):

没有切实可行的方法来做你想做的事。您必须重新实现dotPeek或Reflector的功能,获取方法的IL并对其进行反编译以恢复
开关
语句案例

但是,请注意,
switch
语句可以实现为基于字典的委托分派。如果您这样做,那么您可以只枚举字典的键

例如:

Dictionary<string, Action> switchStatement = new Dictionary<string, Action>
{
    { "hello", (Action)MyHelloAction },
    { "goodbye", (Action)MyGoodbyeAction },
};

void MyHelloAction() { /* ... */ }
void MyGoodbyeAction() { /* ... */ }
实际上,使用
switchStatement
将如下所示:

string myString = "hello";

switchStatement[myString]();

你不费吹灰之力就能做到

首先,在所有情况下删除break语句。 其次,打印所有案例中的所有案例值。您的代码必须看起来像

public function print(String text){
System.out.println(text);
}

switch (myString) 
{
case "hello":
print("hello");

case "goodbye":
print("goodbye");

}
在C#中,有两种相当简单的解决方案,都使用基于字典的分派。第一种是使用委托(有关详细信息,请参见Peter Duniho的回答)。第二个是:

interface Dispatcher
{
    void Action();
}

class HelloDispatcher:Dispatcher
{
    internal void Action()
    {
        //place code here
    }
}

class GoodbyDispatcher:Dispatcher
{
    internal void Action()
    {
        //place code here
    }
}
然后,使用字典类型保存命令


在Java中,只能使用第二种解决方案;我相信您会想要一个树映射,尽管我不能完全确定。

检查您自己的源代码是一种非常不寻常的模式。你想解决什么问题?您最好使用列表或字典来保存“案例”并对其进行迭代,而不是使用开关/案例。如果没有“反射”,则无法分析您自己的代码,因为“反射”更为困难和缓慢。使用枚举/字典保存值会更好。
public function print(String text){
System.out.println(text);
}

switch (myString) 
{
case "hello":
print("hello");

case "goodbye":
print("goodbye");

}
interface Dispatcher
{
    void Action();
}

class HelloDispatcher:Dispatcher
{
    internal void Action()
    {
        //place code here
    }
}

class GoodbyDispatcher:Dispatcher
{
    internal void Action()
    {
        //place code here
    }
}