我需要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
?
答案 0 :(得分:1)
您的类型无法获得动态数量的事件。与其他成员(字段,方法,属性)一样,事件需要在编译时静态定义。所以你可以拥有你的代表字典,你可以在字典中添加/删除代表,并在你想要的时候调用这些代表,但是他们不会成为该类的事件;正如你迄今为止所做的那样,他们需要通过各种方法。
相反,如果您只想要一个单个事件,其中事件的签名是接受T
类型参数的事件,那么您只需要使用在宣布您的活动时,适当的代表,而不是EventHandler
:
public event Action<T> OnAdd; // syntax error