无法将EventHandler定义为事件

时间:2017-09-11 16:28:14

标签: c# events eventhandler

我需要IDictionary<T,K>,只要通过item方法添加Add,就会引发事件。但是引发的事件应该取决于item的键,即如果我将("hello","world")添加到这样的字典中,则应该引发“hello”-event,如果我添加("world","hello") ,然后应该提出“世界” - 事件。​​

所以我试图实现这个并最终得到

class EventDictionary<T,K> : IDictionary<T,K>
{
    private IDictionary<T,K> _internalDic;
    private IDictionary<T, EventHandler> _onAddHandlers;

    public EventHandler OnAdd(T key)
    {
        if (!_onAddHandlers.ContainsKey(key))
            _onAddHandlers[key] = null;
        return _onAddHandlers[key];
    }

    public void Add(T key, K value)
    {
        _internalDic.Add(key, value);
        OnAdd(key)?.Invoke(this, EventArgs.Empty);
    }

    public void Add(KeyValuePair<T, K> item)
    {
        _internalDic.Add(item);
        OnAdd(item.Key)?.Invoke(this, EventArgs.Empty);
    }

    ... // implementing the other methods of IDictionary<T,K>
}

这个编译 - 只要我不添加event关键字:

private IDictionary<T, event EventHandler> _onAddHandlers; // syntax error

OR

public event EventHandler OnAdd(T key) { ... } // syntax error

我错过了什么吗?如何制作OnAdd事件处理程序(所有这些)event

1 个答案:

答案 0 :(得分:1)

您的类型无法获得动态数量的事件。与其他成员(字段,方法,属性)一样,事件需要在编译时静态定义。所以你可以拥有你的代表字典,你可以在字典中添加/删除代表,并在你想要的时候调用这些代表,但是他们不会成为该类的事件;正如你迄今为止所做的那样,他们需要通过各种方法。

相反,如果您只想要一个单个事件,其中事件的签名是接受T类型参数的事件,那么您只需要使用在宣布您的活动时,适当的代表,而不是EventHandler

public event Action<T> OnAdd; // syntax error