Использование 'switch' со строками в файле ресурсов - PullRequest
14 голосов
/ 24 февраля 2011

В моем файле ресурсов (.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 в файле ресурсов связаны между собой. Я хотел бы знать аккуратный способ сделать это.

Edit: Также нашел этот замечательный ответ во время исследования, как использовать Action:

Ответы [ 3 ]

25 голосов
/ 24 февраля 2011

Вы можете использовать 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 },
9 голосов
/ 24 февраля 2011

Вы не можете этого сделать.Компилятор должен уметь оценивать значения, а это значит, что они должны быть литералами или константами.

0 голосов
/ 09 октября 2013

Я только что столкнулся с этой проблемой сам, и хотя этот пост устарел, я решил поделиться своим простым решением для других "Googlers" ... Я решил изменить 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, но мне это помогло.

...