Guid为的EventHandlerList始终为null



我正在尝试实现HTTP服务器发送的事件,如堆栈溢出答案所示。答案会在事件中向所有订阅者发出通知。我希望只有一个特定的客户端收到事件的通知(所以只有做了触发事件的事情的客户端才会收到通知,而不是所有人(。

我使用EventHandlerList注册处理程序,使用Guid作为键。相关代码片段:

public class MessageRepository
{
private readonly EventHandlerList _eventHandlerList;
public MessageRepository()
{
_eventHandlerList = new EventHandlerList();
}
public void Subscribe(Guid guid, Delegate handler)
{
_eventHandlerList.AddHandler(guid, handler);
}
public void Unsubscribe(Guid guid, Delegate handler)
{
_eventHandlerList.RemoveHandler(guid, handler);
}
public void Notify(Guid guid, string message)
{
_eventHandlerList[guid]?.DynamicInvoke(this, new Message(message));
}
}

不幸的是,_eventHandlerList[guid]总是返回为null。我已经验证了使用Dictionary<Guid, Delegate>代替EventHandlerList的类似实现是否正常工作。为什么?

Guid是一个结构,EventHandlerList将键与==运算符进行比较。
var guid = Guid.NewGuid();
object key1 = guid;
object key2 = guid;
Console.WriteLine(key1 == key2); // False

该文档建议使用一个空对象作为关键字。如果你想使用guid,你必须保留和使用它的相同引用。

object guid = Guid.NewGuid();
_eventHandlerList.AddHandler(guid, handler);
Console.WriteLine(_eventHandlerList[guid]);

Dictionary(以及.net中的其他集合(使用Equals来比较键,这就是它适用于guid的原因。

最新更新