Определение правильной функции для вызова на основе параметра - PullRequest
0 голосов
/ 26 сентября 2019

Вот мой сценарий:

У меня ~ 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
    }
}

Я понимаю, что мне пришлось бы немного реорганизовать мои статические классы, чтобы достичь того, чего я хочу (если это возможно), я просто не смогчтобы понять правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...