【问题标题】:How to clone subscribtions to object's events is vs.net?如何克隆对对象事件的订阅是 vs.net?
【发布时间】:2010-11-20 22:02:53
【问题描述】:
我有一个自定义 datagridview 列,我在其中添加了一个事件。
问题是,我不知道如何查看谁订阅了当前列对象的事件并将这些订阅添加到克隆的列对象。
我通过要求调用程序将处理程序的地址传递给自定义列中的委托来解决此问题,而不是向事件添加处理程序。
请原谅我的术语,我希望你明白我想说什么!
通过接收对该方法的引用,datagridviewcolumn 现在拥有控制权,然后可以轻松地克隆该引用。
这很好,但是控件的用户希望能够通过在 Visual Studio 中选择事件来订阅事件 - 这会创建方法的模板。
【问题讨论】:
标签:
vb.net
object
events
clone
subscription
【解决方案1】:
至少在 C# 中,您可以为事件使用“adders”和“removers”,例如属性的 getter 和 setter。
也许您可以在某人向事件添加事件处理程序的过程中使用它来进行一些自定义处理?
编辑
我对VB.NET了解不多,但是google了一下,发现如下sn-p:
Public Delegate Sub WorkDone(ByVal completedWork As Integer )
Private handlers As New ArrayList()
Public Custom Event WorkCompleted As WorkDone
AddHandler (ByVal value As WorkDone)
If handlers.Count <= 5 Then
handlers.Add(value)
End If
End AddHandler
RemoveHandler(ByVal value As WorkDone)
handlers.Remove(value)
End RemoveHandler
RaiseEvent (ByVal completedWork As Integer)
If completedWork > 50 Then
For Each handler As WorkDone In handlers
handler.Invoke(completedWork)
Next
End If
End RaiseEvent
End Event
这应该可以帮助您自定义事件处理程序,以便您可以“看到”在您的类中添加到事件的委托。
【解决方案2】:
对于任何感兴趣的人,我偶然发现了一种无需自定义事件即可执行此操作的方法。
通过在事件名称后面加上Event,您可以访问一些属性和方法。
因此,在 Thorsten 的示例中,我将事件称为 WorkCompletedEvent。
针对这个问题,有一个方法GetInvocationList,它返回附加到事件的委托列表。
除此之外,检查 WorkCompletedEvent IsNot Nothing 是否会告诉您是否有事件的处理程序,而无需检索调用列表。