Хотелось бы спросить, как сделать словарь с делегатом.
Идея такова:
Что я до сих пор: мне удалось сделать то же самое, создав события
delegate void CmdHandler(string[] cmdArgs);
class CMDReader
{
public event CmdHandler _Print;
public event CmdHandler _Help;
private char cmdChar;
}
cmdReader._Print += new CmdHandler(Print);
void Print(string[] args)
но я ищу способ управлять им без события. Я решил, что могу сделать это со словарем, но не уверен, как это сделать.
Вы можете добавить делегатов в Dictionary
, а затем использовать ключ индексатора (я только что принял название команды здесь), чтобы вызвать соответствующее действие. Однако проблема с этим шаблоном заключается в том, что на аргументы ("Все string[]
, с подразумеваемым знанием о значении каждого) имеется ограничение на типизацию и ограничение на общий тип возврата из всех методов (в настоящее время void
).
public class CMDReader
{
delegate void CmdHandler(string[] cmdArgs); // Or Action<string[]>
private readonly IDictionary<string, CmdHandler> _commands;
public CMDReader()
{
_commands = new Dictionary<string, CmdHandler>
{
{
"Print", Print
},
{
"Help", Help
},
};
}
public void InvokeCommand(string command, string[] args)
{
if (_commands.ContainsKey(command))
{
_commands[command].Invoke(args);
// OR (_commands[command])(args);
}
else
{
Console.WriteLine("I don't know that command ...");
}
}
private void Print(string[] args)
{
// Implementation
}
private void Help(string[] args)
{
// Implementation
}
}