C# 事件处理程序

本文关键字:程序 事件处理 | 更新日期: 2023-09-27 17:47:22

如果按钮如何签入 C#。单击事件是否关联了任何处理程序?如果(按钮。单击 != null) 引发编译错误。

C# 事件处理程序

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

有关更多信息,请参阅我关于事件的文章,或查看事件标签(我将添加到这个问题中)。

你为什么需要这个?背景是什么?也许有更好的方法来达到结果
该按钮是一个外部对象,您要做的是检查其内部订阅者列表而不询问它。它违反了封装。
应始终让对象管理其公开的事件的订阅者。如果它希望客户端知道,它将公开一个方法HasClientsRegister。不要闯入。

我认为如果你

在引发事件的班级中,你可以。

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

例如 如果您的事件定义为

event System.EventHandler NewEvent;

然后在您可能创建的引发事件方法上,您可以执行...

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

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

EventDescriptor e = TypeDescriptor.GetEvents(yourObject).查找("您的事件名称", true);