如何将函数添加到集合中

本文关键字:集合 添加 函数 | 更新日期: 2023-09-27 18:25:18

我有一个类,它管理键盘输入,并触发KeyPressedKeyReleasedKeyHeld事件。只有当键存在于我的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.它是一个事件代理,我们在其中使用委托列表。