[英]GetInvocationList of an event in VB.NET
我正在嘗試通過遵循WCF應用程序(來自Sacha Barber)的示例來學習一些WCF原則。
現在我想將以下函數轉換為VB.NET
private void BroadcastMessage(ChatEventArgs e)
{
ChatEventHandler temp = ChatEvent;
if (temp != null)
{
foreach (ChatEventHandler handler in temp.GetInvocationList())
{
handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
}
}
}
但是我遇到了一些問題,因為編譯器不接受以下代碼
Private Sub BroadcastMessage(ByVal e As ChatEventArgs)
Dim handlers As EventHandler(Of ChatEventArgs) = ChatEvent
If handlers IsNot Nothing Then
For Each handler As EventHandler(Of ChatEventArgs) In handlers.GetInvocationList()
handler.BeginInvoke(Me, e, New AsyncCallback(AddressOf EndAsync), Nothing)
Next
End If
End Sub
它說
公共共享事件ChatEvent(sender As Object,e As ChatEventArgs)'是一個事件,不能直接調用
接下來 , 是否有可能在VB.NET中獲取以某種其他方式鏈接到某個事件的處理程序?
使用ChatEventEvent(或EventName事件)
它不會出現在intellisense中,但它的成員會。
VB.NET在幕后創建一個變量,以隱藏編碼器的復雜性......
這僅在聲明事件的類(或可能是其后代)中可用
您可能嘗試在類中聲明此代碼,該類是聲明ChatEvent
事件的類的后代。 這是不可能的,因為事件只能在聲明它們的類中被視為變量(包括調用它們)。 這是因為event
關鍵字實際上向編譯器指示它需要執行一些幕后轉換。
怎么了
考慮這個聲明:
Public Event MyEvent as EventHandler
很簡單吧? 然而,實際上這是做什么的(你只是看不到它)
Private compilerGeneratedName as EventHandler
Public Event MyEvent as EventHandler
AddHandler(ByVal value as EventHandler)
compilerGeneratedName += value
End AddHandler
RemoveHandler(ByVal value as EventHandler)
compilerGeneratedName -= value
End RemoveHandler
RaiseEvent(ByVal sender as Object, ByVal e as EventArgs)
compilerGeneratedName.Invoke(sender, e)
End RaiseEvent
End Event
當你調用這個事件時:
RaiseEvent MyEvent(Me, EventArgs.Emtpy)
它實際上調用了RaiseEvent
塊中的代碼。
編輯
如果VB.NET中的事件不能在任何地方被視為變量(它們可以被視為C#中聲明類中的變量,這就是您的C#示例編譯的原因),那么您必須自己明確地實現該事件。 有關如何執行此操作的詳細信息,請參閱Event語句中的MSDN頁面 。 總而言之,您需要一些方法來存儲多個事件處理程序(或者使用單個事件處理程序以及GetInvocationList
,正如您現在嘗試的那樣)。 在AddHandler
和RemoveHandler
代碼塊中,您將分別添加和刪除事件處理程序列表。
你可以使用這樣的東西:
Private myEventList as New List(Of EventHandler)
Public Custom Event MyEvent as EventHandler
AddHandler(ByVal value as EventHandler)
myEventList.Add(value)
End AddHandler
RemoveHandler(ByVal value as EventHandler)
myEventList.Remove(value)
End RemoveHandler
RaiseEvent(ByVal sender as Object, ByVal e as EventArgs)
For Each evt in myEventList
evt.BeginInvoke(sender, e, New AsyncCallback(AddressOf EndAsync), Nothing)
Next
EndRaiseEvent
End Event
所以現在,如果你打電話
RaiseEvent MyEvent(Me, EventArgs.Emtpy)
它將以您期待的方式提升活動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.