【问题标题】:C# Event HandlersC# 事件处理程序
【发布时间】:2008-10-24 08:50:35
【问题描述】:

如果 button.Click 事件有任何关联的处理程序,我如何检查 C#? If (button.Click != null) 抛出编译错误。

【问题讨论】:

    标签: c# windows events


    【解决方案1】:

    你不能。事件只是公开“添加处理程序”和“删除处理程序”——仅此而已。 (事实上​​,在 CLR 中,您还可以使用元数据将方法与“触发事件”相关联,但 C# 编译器从不生成它。)一些事件发布者可能会提供额外的方法来检查是否有任何订阅者(或者确实让您会看到那些订阅者),但它不是事件模式本身的一部分。

    有关更多信息,请参阅my article about events,或查看events 标签(我将在此问题中添加该标签)。

    【讨论】:

      【解决方案2】:

      为什么需要这个?上下文是什么?也许有更好的方法来实现结果
      该按钮是一个外部对象,您要做的是检查它的内部订阅者列表而不询问它。它违反了封装..
      您应该始终让对象管理它公开的事件的订阅者。如果它想让客户知道,它会公开一个 HasClientsRegistered 方法。不要闯入。

      【讨论】:

        【解决方案3】:

        如果你在引发事件的班级,我想你可以。

        您可以定义处理程序并枚举每个处理程序。

        例如如果您的事件被定义为

        event System.EventHandler NewEvent;
        

        然后在你可能创建的 raise 事件方法上你可以做...

            EventHandler handler = NewEvent;
            if(handler != null)
            {
              handler(this, e);
            }
        

        这将为您提供处理程序,您可以从中获取调用列表。

        【讨论】:

        • 要检查是否有订阅者,您只需要“if (NewEvent != null)” - 但这并不是真正从事件中获取,而是从支持字段获取.鉴于“button.Click”示例,我的回答假设 OP 对其他事件感兴趣。
        【解决方案4】:

        EventDescriptor e = TypeDescriptor.GetEvents(yourObject).Find("yourEventName", true);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-25
          • 1970-01-01
          • 2018-01-25
          • 1970-01-01
          相关资源
          最近更新 更多