在资源文件中使用字符串的'switch'语句

16

我在我的资源(.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,但我个人不喜欢这样做。我喜欢这个问题的最高评价答案:在 switch 语句中使用字符串集合。但是,我需要确保我的enum和资源文件中的strings相互关联。我想知道一个简洁的方法来实现这一点。 编辑: 在研究如何使用Action时,我还找到了这个很棒的答案
3个回答

29
你可以使用一个Dictionary<string, Action>。你可以将每个字符串对应的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
@JS_GodBlessAll 我会说这个例子不是访问者模式,因为在访问者模式中,对象(在本例中为字符串)必须有一个接受方法,该方法根据对象(在本例中为字符串的值)而改变,并且访问者将对自身的引用传递给对象。我会说这段代码更类似于https://dev59.com/fXE85IYBdhLWcg3wzW3M#2604798中的代码片段,只是将各种`Add`放入了`Dictionary`中。 - xanatos
1
@JS_GodBlessAll 最终结果类似于访问者模式:操作数量可以在运行时扩展,因此每个对象类型可以简单地将自己添加到“actions”中,但实现方式不同(中央动态调度程序与对象内部的代码处理访问者)。 - xanatos
@JS_GodBlessAll 如果你看一下C语言的例子http://en.wikipedia.org/wiki/Multiple_dispatch#C,`collisionCases`就是`actions`,`collide(...)`是我写的示例代码。 - xanatos
@xanatos 非常感谢!我会继续阅读以更好地理解。 - Jaya
这是否可以被视为策略模式的一个例子? - Chazt3n
显示剩余3条评论

9

你做不到那样。编译器必须能够评估这些值,这意味着它们需要是文字或常量。


0

我刚刚遇到了这个问题,虽然这篇文章已经有点老了,但我想分享一下我的简单解决方案给其他的“谷歌党”们…… 我选择将 switch...case 改为多个 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
        }
    }
}

绝对不如 switch...case 美观,但对我很有效。


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