Вот мой сценарий:
У меня ~ 100 000 string[]
, входящего в функцию с именем CallCommand(string[] command)
.У меня есть ~ 50 статических классов, каждый из которых содержит один и тот же метод: public static void ParseCommand(string[] command)
.
Моя CallCommand
функция проверяет первый параметр string[]
и вызывает правильный класс ParseCommand
.
Я пытаюсь найти способ автоматического вызова нужной функции (используя обобщенные значения?) Без оператора switch.
В настоящее время я использую большой оператор switch следующим образом (показывает только несколько, поскольку их ~ 50):
public static void CallCommand(string[] command)
{
string commandVerb = command.First().ToLower();
switch (commandVerb)
{
case "add":
AddCommand.ParseCommand(command);
break;
case "attach":
AttachCommand.ParseCommand(command);
break;
case "assign":
AssignCommand.ParseCommand(command);
break;
case "cancel":
RunCommand.ParseCommand(command);
break;
case "center":
CenterCommand.ParseCommand(command);
break;
case "complain":
ComplainCommand.ParseCommand(command);
break;
default:
Log("This command doesn't exist.");
break;
}
}
Я хотел немного уменьшить код, поэтому япопытался использовать Dictionary<string, Action>
вместо этого (опять же, здесь уменьшено количество пар ключ / значение, поскольку их ~ 50):
private static readonly Dictionary<string, Action<string[]>> handlers = new Dictionary<string, Action<string[]>
{
["add"] = new Action<string[]>(AddCommand.ParseCommand),
["assign"] = new Action<string[]>(AssignCommand.ParseCommand),
["attach"] = new Action<string[]>(AttachCommand.ParseCommand),
["cancel"] = new Action<string[]>(AddCommand.ParseCommand),
["center"] = new Action<string[]>(AddCommand.ParseCommand),
["complain"] = new Action<string[]>(ComplainCommand.ParseCommand)
};
Вот функция CallCommand
после настройки словаря:
public static void CallCommand(string[] command)
{
string commandVerb = command.First().ToLower();
handlers[commandVerb].Invoke(command);
}
Наконец, вот пример одного из моих статических классов.Все они настроены одинаково.Они просто делают разные вещи в своем методе ParseCommand
:
public static class AssignCommand
{
public static void ParseCommand(string[] command)
{
//do stuff with command
}
}
Я понимаю, что мне пришлось бы немного реорганизовать мои статические классы, чтобы достичь того, чего я хочу (если это возможно), я просто не смогчтобы понять правильный путь.