Использование "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
, но работал у меня.