事件字典(每个值可以包含多个方法)
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)
}
当然还有处理触发这些事件处理程序的方法。
但是我该如何声明这样一个字典呢?
只需将您的字典声明为 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
枚举来注册操作。
我曾尝试在之前的帖子中寻找答案,但没有找到。
我正在做一个 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)
}
当然还有处理触发这些事件处理程序的方法。
但是我该如何声明这样一个字典呢?
只需将您的字典声明为 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
枚举来注册操作。