事件字典(每个值可以包含多个方法)

Dictionary of events (each value can hold several methods)

我曾尝试在之前的帖子中寻找答案,但没有找到。
我正在做一个 MonoGame 游戏,我决定要有一个基于事件的键盘处理程序。

所以 KeyboardHandler class 是一个单例 class, 现在它有:
-委托无效 KeyPressEventHandler()
- 四个箭头键的代表事件
- 单例 class 的静态实例
- 获取该实例的方法
- while(true) 线程方法和创建调用该方法的线程的方法。

线程方法只是 while(true) 检查是否按下了四个箭头键中的任何一个,并在需要时激活它们各自的事件。

我希望能够创建 <Keys, (event or whatever)> 的字典,这样我就可以:

void doSomething() { }
KeyboardHandler.Get().SubscribeToEvent(Keys.A, doSomething)
void SubscribeToEvent(Keys key, Action toSubscribe)
{
    this.KeypressHandler[key] += new KeypressEventHandler(tobSubscribe)
}

当然还有处理触发这些事件处理程序的方法。

但是我该如何声明这样一个字典呢?

编辑:最终在这里实现:https://github.com/gioragutt/training/blob/master/MonoGameFirst/MonoGameFirst/BaseGameClasses/KeyboardHandler.cs

只需将您的字典声明为 Dictionary<Keys, Action>。然后你只需要检查你的字典是否真的包含那个键。请记住,标准 Action 只是一个具有 0 个输入参数并且没有 return 值的方法。如果需要,您可以使用接受一组输入参数的其他操作之一。您的代码可能类似于以下内容:

设置你的词典:

var keyHandlers = new Dictionary<Keys, Action>(); 
keyHandlers.Add(Keys.Back, () => Console.WriteLine("Handler for backspace"));
keyHandlers.Add(Keys.Enter, () => {
    //some other statements, 
    //maybe set some class-level property 
    Console.WriteLine("Handler for enter ");
});
keyHandlers.Add(3, NameOfMethodThatMatchesActionDelegateSignature);

然后在主事件处理程序中,检查字典并尝试做一些事情:

Action actionToDo;
bool actionRegistered = keyHandlers.TryGetValue(key, out actionToDo);
if (actionRegistered)
{
    actionToDo.Invoke();
}

A demo 使用整数而不是 Keys 枚举来注册操作。