如何将函数添加到集合中
本文关键字:集合 添加 函数 | 更新日期: 2023-09-27 18:25:18
我有一个类,它管理键盘输入,并触发KeyPressed、KeyReleased或KeyHeld事件。只有当键存在于我的Controller组件的KeyBindings集合中时,它才会触发事件。既然我已经完成了所有这些工作,我就陷入了一个问题。我想要的是以下内容:
Key pressed.
if(Key bind exists)
Fire key pressed event.
foreach(function in keyBinds)
{
execute function, fire event, whatever...
}
我只是不知道foreach循环是如何工作的。有什么想法可以让我完成这样的事情吗?
键盘控制器组件:
public class KeyboardController : IComponent
{
//Fields
private Dictionary<Keys, HashSet<Delegate>> m_keyBindings = new Dictionary<Keys,HashSet<Delegate>>();
//Properties
public Dictionary<Keys, HashSet<Delegate>> KeyBindings
{
get { return m_keyBindings; }
}
}
这是一个类,它将包含键及其函数/delete/event/anything绑定。事件的代码不能包含在这个类中,因为这个类只用于存储数据。我需要传递一个键绑定和一个操作或一组操作,以便在按下该绑定时执行。
添加绑定:
//Set key bindings
KeyboardController kbController = entityManager.GetComponent<KeyboardController>(1);
kbController.KeyBindings.Add(Keys.Up, new HashSet<Delegate>());
kbController.KeyBindings[Keys.Up].Add(function);
我不知道如何使"添加绑定:"中的第三行起作用。
您可以使用多播委托为给定的键自动触发多个事件,这样您就不需要维护事件集合。例如:
Dictionary<Key, Action> bindings = ...
Action binding;
if (binding.TryGetValue(key, out binding))
binding(); // this will execute multiple events if they are hooked
挂钩事件:
bindings[Keys.A] += new Action(MyAKeyHandler);
如果出于某种原因你不想使用多播代理,你可以这样做:
List<Action> handlers = binding[key];
...
if (handlers != null)
foreach (var handler in handlers)
handler();
使用实际的委托类型,如Action<>,而不是HashSet。例如:
Dictionary<Keys, Action> handlers = ...
handlers[key] += function;
由于C#具有作为一级语言对象的委托类型,因此您可以非常直接地保留一组函数
var keyBinds = new List<Action<KeyPressEventArgs>>();
KeyPressEventArgs args = /* Something from the actual keypress event */;
foreach (Action<KeyPressEventArgs> function in keyBinds)
{
function(args);
}
您可以为此目的使用委托集合。检查此链接:http://xenta.codeplex.com/SourceControl/changeset/view/068ddfd6bf36#trunk%2fSrc%2fFwk%2fXenta.EventBroker.Default%2fBroker.cs.它是一个事件代理,我们在其中使用委托列表。