我正在尝试为我的应用程序构建一个自定义命令行,我有几个基本命令,我只是使用一堆" if"用于检查命令是什么的语句。目前它看起来像这样
boost::thread myThread(&my_lengthly_method);
myThread.detach();
}
基本上就是这样。我有一个mainForm和命令行表单。将字符串输入键入命令行,然后检查命令名称并从mainForm执行一些函数。
我的问题是,实施此类事情的最佳方式是什么?我当然可以继续写一堆" if" s,但有些东西告诉我它不是最好的方法。
我想过创建课程" Command"
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中的函数。
欢迎任何想法!
答案 0 :(得分:1)
您可以将所有命令填入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
出口
当然,您仍然需要使用(至少)尽可能多的行来设置命令。并且还需要进行类似数量的错误检查。
但命令处理部分可以变得非常简单。