我的资源(.resx)文件中有一堆字符串。我试图直接使用它们作为switch语句的一部分(参见下面的示例代码)。
class Test
{
static void main(string[] args)
{
string case = args[1];
switch(case)
{
case StringResources.CFG_PARAM1: // Do Something1
break;
case StringResources.CFG_PARAM2: // Do Something2
break;
case StringResources.CFG_PARAM3: // Do Something3
break;
default:
break;
}
}
}
我查看了一些解决方案,其中大多数似乎都暗示我需要将它们声明为const string
我个人不喜欢。
我喜欢这个问题的最高投票解决方案:using collection of strings in a switch statement。但是我需要确保资源文件中的enum
和strings
绑定在一起。我想知道一种巧妙的方法。
修改
在研究如何使用Action
时也找到this great answer:
答案 0 :(得分:25)
您可以使用Dictionary<string, Action>
。您为Dictionary中的每个字符串添加Action
(一个方法的委托)并搜索它。
var actions = new Dictionary<string, Action> {
{ "String1", () => Method1() },
{ "String2", () => Method2() },
{ "String3", () => Method3() },
};
Action action;
if (actions.TryGetValue(myString, out action))
{
action();
}
else
{
// no action found
}
作为旁注,如果Method1
已经是Action
或void Method1()
方法(没有参数且没有返回值),则可以
{ "String1", (Action)Method1 },
答案 1 :(得分:9)
你做不到。编译器必须能够评估值,这意味着它们需要是文字或常量。
答案 2 :(得分:0)
我自己刚刚遇到过这个问题,虽然这篇文章很老,但我认为我会为其他“Google员工”分享我的简单解决方案......我选择将switch...case
更改为多个{{1 }}
if(...) elseif
绝对不如class Test
{
static void main(string[] args)
{
string case = args[1];
if(case.Equals(StringResources.CFG_PARAM1))
{
// Do Something1
}
else if (case.Equals(StringResources.CFG_PARAM2))
{
// Do Something2
}
else if (case.Equals(StringResources.CFG_PARAM3))
{
// Do Something3
}
else
{
// Do something else
}
}
}
漂亮,但对我有用。