2013-05-21 22 views
1

我設法可以存儲事件的字典:存儲在字典中的事件,然後再撫養他們

'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 
+2

這是在好奇心的鍛鍊,還是有你試圖解決一個問題? – Adrian

+0

請提供我們可以複製的真實代碼。 – Neolisk

+0

使用[自定義關鍵字](http://msdn.microsoft.com/en-us/library/wf33s4w7%28v=vs.80%29.aspx)定義自定義事件。使用訪問器更新目錄。 –

回答

3

這聽起來像一層間接的方式可以幫助你。不是字符串直接映射到事件中,映射字符串的操作,將引發該事件,像這樣:

Private mapping As New Dictionary(Of String, Action) From _ 
    {{"happened", Sub() RaiseEvent ItHappened()}, 
    {"almostHappened", Sub() RaiseEvent ItAlmostHappened()}} 
+0

啊,好多了!令人驚訝的是額外的層次有時可以做到:) –

相關問題