在资源文件中使用'switch'和字符串

时间:2011-02-23 21:08:23

标签: c# .net switch-statement embedded-resource

我的资源(.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。但是我需要确保资源文件中的enumstrings绑定在一起。我想知道一种巧妙的方法。

修改 在研究如何使用Action时也找到this great answer

3 个答案:

答案 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已经是Actionvoid 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 } } } 漂亮,但对我有用。