使用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事件中获取相同类型的信息?
答案 0 :(得分:3)
event
的全部内容(仅限)add
/ remove
API(就像属性如何定义get
/ set
)。
事件的整点是外部您无法执行此操作(访问订阅者)。我猜测在“时钟”示例中,访问列表的代码是里面声明event
的类型;没关系:在类型中,您可以完全访问支持实现(通常是委托字段)。
在外部,你应该只关心你自己的处理程序,你已经知道,因为你订阅了它们。尝试获取支持者存在,但它很脆弱,不推荐。在这种情况下,它使用EventHandlerList
,例如。
你为什么需要这个?这通常意味着你做错了(抱歉,但确实如此)。