C# 检查事件处理程序是否附加到和事件

C# 检查事件处理程序是否附加到和事件,c#,events,event-handling,C#,Events,Event Handling,添加处理程序 if(!ClickHandled) this.Click += (s, e) =>{ } 删除处理程序: if(ClickHandled) this.Click -= (s, e) =>{ } 是否有办法知道是否已经有一个事件处理程序附加到控件(并可能获取它们的列表,例如获取click event的事件处理程序列表) 您可以这样做,前提是您有权访问类的源。注意,这样你就放弃了控制何时将所有委托调用到你的类的客户端,这不是一个好主意。如果您不是在查找e

添加处理程序

if(!ClickHandled)
    this.Click += (s, e) =>{ }
删除处理程序:

if(ClickHandled)
    this.Click -= (s, e) =>{ }

是否有办法知道是否已经有一个事件处理程序附加到控件(并可能获取它们的列表,例如获取click event的事件处理程序列表)

您可以这样做,前提是您有权访问类的源。注意,这样你就放弃了控制何时将所有委托调用到你的类的客户端,这不是一个好主意。如果您不是在查找eventhandler列表,而是只想知道事件是否已订阅。可能您可以使用另一种方法,该方法仅告诉单击事件是否已被任何人订阅

 class MyButton
    {
     delegate void ClickHandler(object o ,EventArgs e);
     public event ClickHandler Click;
     ......

      public List<ClickHandler> ClickHandlerList
      {
         get
          {
              return ClickHandler.GetInovationList().Cast<ClickHandler>().ToList();
          }
       }

      public bool IsClickEventSubcribed
      {
         get
          {
              return ClickHandler.GetInovationList().Cast<ClickHandler>().Any();
          }
       }
    }
classmybutton
{
委托无效ClickHandler(对象o、事件参数e);
公共事件ClickHandler Click;
......
公共列表单击手柄列表
{
得到
{
返回ClickHandler.GetInovationList().Cast().ToList();
}
}
公共图书馆被转载
{
得到
{
返回ClickHandler.GetInovationList().Cast().Any();
}
}
}

如果这样做的目的是停止向事件监听器发送信号,那么通过检查来包装发送不是更容易吗

if (NotifyingEnabled)
{
    SomeEvent.Raise(this);
}

您可以实现从继承的类。对于这个类,您可以实现任何您想要的附加行为。例如,您可以创建一个包含对象事件映射的集合,并可以实现一个搜索给定对或模式的方法。

如果您有权访问公开事件的类的源,则可以使用委托获取所有事件处理程序……但如果您希望使用内置控件实现此操作……则可以使用上面提到的反射链接可以使用可能是一个问题。为什么您需要知道处理程序的数量?事件是一种关于某件事的信号传递方式,无论是否有订阅者,我都可以访问事件的来源class@Sinatr我有一个从
FileSystemWatcher
类继承的类,有
WatchForChanges
WatchForCreations
接受booean值的属性。我希望在值设置为true时添加处理程序,在值设置为False时删除处理程序。如果您只想这样做,则无需查看当前是否附加了任何处理程序。存储属性的上一个值,如果该值已更改,则连接或删除处理程序。很简单。