如何知道事件的事件处理程序数量?
我想要一种方法来执行以下代码:
// if (control.CheckedChanged.Handlers.Length == 0)
{
control.CheckedChanged += (s, e) =>
{
// code;
}
}
注意:此代码在控件类的外面。
提前致谢。
答案 0 :(得分:3)
您不能,因为只有公开事件的类型才能访问实际的委托。在控件内,你可以做类似的事情:
if (MyEvent!= null)
{
EventHandler[] handlers = (EventHandler[])MyEvent.GetInvocationList();
foreach(EventHandler handler in handlers)
{
...
}
}
或者,对于你想要做的事情:
if (CheckedChanged == null)
{
CheckedChanged += (s, e) =>
{
// code;
}
}
答案 1 :(得分:1)
我的回答更多是对托马斯·莱维斯克的评论,但我还没有发表评论,所以这里什么都没有。我发现C#的这个区域有点难看,因为有可能引入竞争条件 - 即不同的线程可能会竞争,你可以用if
CheckedChanged != null
语句
if (CheckedChanged == null)
{
CheckedChanged += (s, e) =>
{
// code;
}
}
你应该锁定这段代码,但在很多情况下你会发现自己编写这样的代码
//Invoke SomeEvent if there are any handlers attached to it.
if(SomeEvent != null) SomeEvent();
但SomeEvent可能会在这个过程中被淘汰,所以写这样的东西会更安全
SomeEVentHandler handler = SomeEvent;
if (handler != null) handler();
......只是为了更安全。