Конечно, вы можете передавать события ... Ну, вы можете передать Action(Of EventHandler)
, который может делать то, что вы хотите.
Если у вас есть класс, который определяет событие следующим образом:
Public Class ComboBox
Public Event SelectedIndexChanged As EventHandler
End Class
Учитывая экземпляр ComboBox
, вы можете затем создать действия добавления и удаления обработчика следующим образом:
Dim combobox1 = New ComboBox()
Dim ah As Action(Of EventHandler)
= Sub (h) AddHandler combobox1.SelectedIndexChanged, h
Dim rh As Action(Of EventHandler)
= Sub (h) RemoveHandler combobox1.SelectedIndexChanged, h
(Теперь, это код VB.NET 4.0, но вы можете сделать это в 3.5, используя AddressOf
и немного попозже.)
Так что, если у меня есть обработчик Foo
:
Public Sub Foo(ByVal sender as Object, ByVal e As EventArgs)
Console.WriteLine("Over here with Foo!")
End Sub
И метод Raise
на ComboBox
Теперь я могу сделать это:
ah(AddressOf Foo)
combobox1.Raise()
rh(AddressOf Foo)
Это пишет сообщение "Сюда с Фу!" как и ожидалось.
Я также могу создать этот метод:
Public Sub PassActionOfEventHandler(ByVal h As Action(Of EventHandler))
h(AddressOf Foo)
End Sub
Я могу передать действия обработчика событий следующим образом:
PassActionOfEventHandler(ah)
combobox1.Raise()
PassActionOfEventHandler(rh)
Который снова пишет сообщение «Сюда с Foo!».
Теперь одна проблема, которая может быть проблемой, заключается в том, что вы можете случайно поменять местами делегаты обработчиков событий добавления и удаления - в конце концов, они одного типа. Поэтому легко определить строго типизированные делегаты для действий добавления и удаления, например:
Public Delegate Sub AddHandlerDelegate(Of T)(ByVal eh as T)
Public Delegate Sub RemoveHandlerDelegate(Of T)(ByVal eh as T)
Код для определения экземпляров делегата не изменяется, за исключением типов делегатов:
Dim ah As AddHandlerDelegate(Of EventHandler)
= Sub (h) AddHandler combobox1.SelectedIndexChanged, h
Dim rh As RemoveHandlerDelegate(Of EventHandler)
= Sub (h) RemoveHandler combobox1.SelectedIndexChanged, h
Так что теперь это позволяет вам быть очень креативным. Вы можете определить функцию, которая будет принимать делегат обработчика добавления, делегат обработчика удаления и обработчик события, который подключит обработчик события, а затем вернет вам IDisposable
, который вы можете использовать позже для удаления обработчика без необходимо сохранить ссылку на обработчик событий. Это удобно для использования Using
операторов.
Вот подпись:
Function SubscribeToEventHandler(
ByVal h as EventHandler,
ByVal ah As AddHandlerDelegate(Of EventHandler),
ByVal rh As RemoveHandlerDelegate(Of EventHandler)) As IDisposable
Итак, с помощью этой функции я теперь могу сделать это:
combobox1.Raise()
Using subscription = SubscribeToEventHandler(AddressOf Foo, ah, rh)
combobox1.Raise()
combobox1.Raise()
End Using
combobox1.Raise()
И это пишет сообщение "Сюда с Фу!" только дважды. Первый и последний вызовы Raise
находятся вне подписки на обработчик событий.
Наслаждайтесь!