Как реализовать пользовательскую командную строку и выполнение - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь создать собственную командную строку для своего приложения, у меня есть несколько основных команд, и я просто использую кучу операторов "if", чтобы проверить, что это за команда.в настоящее время это выглядит примерно так:

public void ExecuteCommand()
    {
        string input = ReadLine(); //gets last string from input
        bool isDone = false; //need bool to check whether command was executed or no, by default false.

        Match result = Regex.Match(input, @"([^\s]+)"); //to get command name
        string commandName = result.Value.ToLower();

        string value = Regex.Match(input, @"\s(.*)").Value; //to get its parameter. currently everything after ' ' space.

        if (commandName == "close")
        {
            Close(); isDone = true;
        }

        //so commandline is separate window, and appendedForm is a main form. in which some functions are executed.

        if (commandName == "exit")
        {
            appendedForm.Close();
        }

        if (commandName == "spoof")
        {
            appendedForm.Fn_Spoof();
            isDone = true;
        }

        if(commandName == "spoofstop")
        {
            appendedForm.Fn_StopCapture();
            isDone = true;
        }

        if(commandName == "scan")
        {
            appendedForm.Fn_Scan(); isDone = true;
        }

        if(commandName == "clear")
        {
            output.Text = "";
            WriteLine("Console cleared. Cache is empty.");
            //data_lines.Clear();

            isDone = true;

        }
        ...
}

Так вот в принципе и все.У меня есть mainForm и форма командной строки.ввод строки вводится в командной строке, затем я проверяю имя команды и выполняю некоторую функцию из mainForm.

Мой вопрос: каков наилучший способ реализации такого рода вещей?Я, конечно, могу просто продолжать писать «если», но что-то подсказывает мне, что это не лучший способ сделать это.

Я думал о создании класса "Command"

 public class Command
 {
    public string name;
    public string description;
    public bool hasParameter;

    Command()
    {

    }
 }

и сохранении всех команд в некотором массиве, но я не уверен, как бы я использовал это для вызова функции изMainForm.

Любые идеи приветствуются!

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете поместить все команды в Dictionary<string, someDelegate>;если вы можете жить со всеми командами, имеющими одинаковый тип возврата.

Я использовал строку и настроил несколько команд.

Я использую paramsключевое слово, чтобы избежать уродливого new object[] при каждом вызове.

Вам все еще нужно приводить аргументы, если только вы не можете сделать их все одного типа.(Что на самом деле может быть не такой уж плохой идеей, поскольку все они взяты из входной строки ..)

Вот пример:

public delegate string cmdDel(params object[] args);

Dictionary<string,  cmdDel> cmd = new Dictionary<string,  cmdDel>();

Добавьте несколько функций:

cmd.Add("clear", cmd_clear);
cmd.Add("exit", cmd_exit);
cmd.Add("add", cmd_add);
cmd.Add("log", cmd_log);

С этими телами:

public string cmd_clear(params object[] args)
{
    return "cleared";
}

public string cmd_exit(params object[] args)
{
    return "exit";
}

public string cmd_add(params object[] args)
{
    return ((int)args[0] + (int)args[1]).ToString();
}

public string cmd_log(params object[] args)
{
    StringBuilder log = new StringBuilder();
    foreach (object a in args) log.Append(a.ToString() + " ");
    return log.ToString(); 
}

И тест:

Console.WriteLine(cmd["clear"]());
Console.WriteLine(cmd["add"]( 23, 42));
Console.WriteLine(cmd["log"]( 23, "+" + 42, "=", cmd["add"]( 23, 42) ));
Console.WriteLine(cmd["exit"]());

очищен

65

23 +42 = 65

выход

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

Но часть обработки команд может быть довольно простой.

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