2013-05-21 3 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 после добавления обработчика, тогда все будет хорошо. Есть ли способ сделать что-то подобное программно? Или иначе сохранить строку -> карту событий для перевода ввода строки в события во время выполнения?

Edit:

Реальный код по запросу. Это часть механизма, позволяющего нам передавать команды на 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

А, намного лучше! Удивительно, что дополнительный слой может делать в разы :) –

Смежные вопросы