Использование "switch" со строками в файле ресурсов

У меня есть куча строк в файле моего ресурса (.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:

Ответы

Ответ 1

Вы можете использовать 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 },

Ответ 2

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

Ответ 3

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