如何在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
}
}