Вы можете поместить все команды в 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
выход
Конечно, вам все равно нужно использовать (как минимум) столько строк для настройки, сколько у вас есть команд.Также необходимо выполнить аналогичную проверку ошибок.
Но часть обработки команд может быть довольно простой.