我設法可以存儲事件的字典:存儲在字典中的事件,然後再撫養他們
'Terrible .NET events... where's sender and e?!
Public Event ItHappened()
Public Event ItAlmostHappened()
Private mapping As New Dictionary(Of String, System.Delegate) From _
{{"happened", ItHappenedEvent},
{"almostHappened", ItAlmostHappenedEvent}}
太好了!現在我有了這本詞典,我可以將一個字符串類型的事件流轉換成我是一個真正的男孩事件!我甚至想出如何稱呼他們:
mapping(key).DynamicInvoke()
但可惜mapping(key)
是空......即使添加的處理程序事件之後。如果我在添加處理程序後將字典中的值更新爲mapping("happened") = ItHappenedEvent
,則一切正常。有沒有辦法通過編程實現類似的功能?或以其他方式存儲字符串 - >事件映射,以便在運行時將字符串輸入轉換爲事件?
編輯:
真正的代碼的要求。這是允許我們將命令傳遞給運行在服務器上的WinService的機制的一部分。 「做最簡單的事情你可以做」的方法導致我們使用服務器上的文件作爲信號機制。
Public Class CommandChecker
Implements IDisposable
Public Event RefreshPlannableStations()
Private _knownCommmands As New Dictionary(Of String, System.Delegate) From _
{{"refreshStations", RefreshPlannableStationsEvent}}
Private WithEvents _fsw As FileSystemWatcher
Public Sub New(ByVal path As String)
Me._fsw = New FileSystemWatcher(path, "*.command")
End Sub
Private Sub fsw_Created(ByVal sender As Object,
ByVal e As FileSystemEventArgs) Handles _fsw.Created
If Me._knownCommmands.ContainsKey(key) Then
Me._knownCommmands(key).DynamicInvoke()
'Delete file to acknowledge command
EndIf
End Sub
'Snipped IDisposable stuff
End Class
在其他地方,我們創建這個類,然後訂閱它的事件。
Me._checker = New CommandChecker()
AddHandler Me._checker.RefreshPlannableStations, AddressOf OnRefreshStations
這是在好奇心的鍛鍊,還是有你試圖解決一個問題? – Adrian
請提供我們可以複製的真實代碼。 – Neolisk
使用[自定義關鍵字](http://msdn.microsoft.com/en-us/library/wf33s4w7%28v=vs.80%29.aspx)定義自定義事件。使用訪問器更新目錄。 –