Ciao, mi hanno posto questa domanda:
data un'istanza di un oggetto e un suo evento è possibile dall'esterno
risalire al metodo associato all'evento stesso?
Ho eseguito un po di googling, ed ho trovato questo prezioso articolo (un po di hacking sugli eventi), a partire dall'articolo ho cercato, e sono riuscito a dare la risposta alla domanda:
Imports System
Imports System.Collections.Generic
Imports System.Reflection
Module test
Public Sub Main(ByVal args As String())
Dim cm As New classManager()
cm.ce.Fire()
Dim f() As FieldInfo = cm.ce.GetType().GetFields(BindingFlags.Instance Or BindingFlags.NonPublic)
Dim x As FieldInfo = f(0)
Dim evtValue As Object = x.GetValue(cm.ce)
If evtValue IsNot Nothing Then
Dim evtDelegate As System.MulticastDelegate = TryCast(evtValue, [Delegate])
Dim delList As [Delegate]() = evtDelegate.GetInvocationList()
For Each d As [Delegate] In delList
Console.WriteLine(d.Method.Name)
Next
End If
Console.ReadKey()
End Sub
End Module
Class classEvento
Public Event evento As EventHandler
Public Sub Fire()
RaiseEvent evento(Me, New EventArgs())
End Sub
End Class
Class classManager
Public ce As classEvento
Public Sub New()
ce = New classEvento
AddHandler ce.evento, AddressOf e_esegui
End Sub
Private Sub e_esegui(ByVal sender As Object, ByVal e As EventArgs)
System.Console.WriteLine("Fire Evento." & vbCrLf)
End Sub
End Class
Considerazioni:
la classe *classEvento* all'interno della funzione *Fire* esegue la *RaiseEvent* in C# è necessario verificare l'evento stesso prima di emetterlo:
if (event != null)
{
event(this, e);
}
Questa differenza perchè la *RaiseEvent* esegue in automatico il controllo a nothing sull'evento.
Tags: VB Event Delegate Handler