如何在运行时检索事件的订阅者列表?

时间:2009-12-18 19:59:44

标签: c# winforms events

使用Delegate时,我可以使用Delegate.GetInvocationList()方法在运行时检索委托的调用列表。

有没有办法访问与事件关联的订阅者列表?我从这个example (SO#1237001)运行代码,并且立即窗口允许我将SecondChange事件转换为System.MultiCastDelegate,然后调用GetInvocationList方法。

但是,在我的场景中,我正在使用System.Windows.Forms.DataGridView,我想在运行时检查CellClick事件的调用列表。但是,当我在CellClick上尝试任何类型的强制转换时,我收到以下错误:

  

活动   'System.Windows.Forms.DataGridView.CellClick'   只能出现在左侧   + =或 - =

我可以看到这些事件的声明明显存在差异。在Clock示例中,事件声明如下:

public event Func<DateTime, bool> SecondChange;

在DataGridView中,事件声明如下:

[SRDescription("DataGridView_CellClickDescr"), SRCategory("CatMouse")]
public event DataGridViewCellEventHandler CellClick
{
    add
    {
        base.Events.AddHandler(EVENT_DATAGRIDVIEWCELLCLICK, value);
    }
    remove
    {
        base.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLCLICK, value);
    }
}

为什么可以在Clock示例上调用GetInvocationList,而不是在DataGridView事件上调用?有没有办法让我从GetInvocationList返回的DataGridView事件中获取相同类型的信息?

1 个答案:

答案 0 :(得分:3)

event的全部内容(仅限)add / remove API(就像属性如何定义get / set)。

事件的整点是外部您无法执行此操作(访问订阅者)。我猜测在“时钟”示例中,访问列表的代码是里面声明event的类型;没关系:在类型中,您可以完全访问支持实现(通常是委托字段)。

在外部,你应该只关心你自己的处理程序,你已经知道,因为你订阅了它们。尝试获取支持者存在,但它很脆弱,不推荐。在这种情况下,它使用EventHandlerList,例如。

你为什么需要这个?这通常意味着你做错了(抱歉,但确实如此)。