Я знаю, что в VB .Net можно определить свой пользовательский обработчик событий.Различные способы повышения пользовательского события в .NET Framework
Это способ для класса узнать, когда другой слушает его события. Этот пример кода происходит от MSDN:
Private Events As EventHandlerList
Public Custom Event MyEvent As EventHandler
AddHandler(value As EventHandler)
Events.AddHandler("Test", value)
End AddHandler
RemoveHandler(value As EventHandler)
Events.RemoveHandler("Test", value)
End RemoveHandler
RaiseEvent(sender As Object, e As EventArgs)
CType(Events("Test"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
Теперь, это то, как вы можете поднять пользовательское событие:
Private Sub MySub()
RaiseEvent MyEvent(Me, EventArgs.Empty)
End Sub
До сих пор так хорошо, никаких проблем вообще.
Мой вопрос в том, что в моем классе у меня есть прямой доступ к EventHandlerList, могу ли я вызвать его вне настраиваемого обработчика событий? И если да, то есть ли разница между тем, что этот суборд делает из того, что выше?
Private Sub MySub2()
CType(Events("Test"), EventHandler).Invoke(Me, EventArgs.Empty)
End Sub
Я знаю, что это, вероятно, нет хороших привычек на всех, я просто любопытно, как я могу иметь функцию, которая передается название события, как String
так, что путь повышения событие могло бы работать для меня, я бы сделать что-то вроде:
Private Sub RaiseCustomEvent(EventName As String, Ev as EventArgs)
CType(Events(EventName), EventHandler).Invoke(Me, Ev)
End Sub
Этот пример MSDN основан на значении ключа ('String'), которое будет [Interned] (https://msdn.microsoft.com/en-us/library/system.string.isinterned (v = vs 0,110) .aspx). Ключевым аргументом является тип 'Object', а свойство' EventHandlerList.Item' использует ссылочное равенство при поиске запрашиваемого обработчика, а не сравнительного сравнения по умолчанию для базового типа. Было бы лучше явно объявить ключ, т. Е. «Private MyEventKey As New Object».Кроме того, вы должны проверить, что результат «События (EventName)» не является чем-то другим, прежде чем пытаться вызвать 'Invoke'. – TnTinMn
Также будьте осторожны, если вы добавите настраиваемое событие в класс Form и 1) объявите новый «EventHandlerList» для хранения событий и 2) впоследствии присоедините обработчик событий через VS IDE, который создает метод с предложением 'Handles'. Из-за того, как работает компилятор VB, сгенерированный код будет пытаться добавить обработчик событий в «EventHandlerList» до создания экземпляра «EventHandlerList». Это приводит к исключению нулевой ссылки при создании формы. – TnTinMn