Oggi nel newsgroup Microsoft su VB.NET e' stato chiesto come scorrere l'elenco dei subscribers ad un determinato evento. La risposta era alquanto semplice: Utilizzare la GetInvocationList() esposta dalla classe Delegate.
L'equivalente in C# era qualcosa tipo:
public
class Clock
{
public delegate void TickDelegate();
public event TickDelegate Tick;
public void DoTest()
{
foreach(System.Delegate d in Tick.GetInvocationList()){
d.DynamicInvoke(null);
}
}
L'equivalente in VB.NET:
Public
Class Clock
Public Event Tick()
Public Sub DoClick()
For Each del As [Delegate] In ???
del.DynamicInvoke(Nothing)
Next
End Sub
End Class
Il problema era come recuperare il delegate che VB.NET crea per noi quando creiamo un evento, dopo qualche prova non andata a buon fine (ho provato tutto quello che Reflection mi metteva a disposizione...) ho lanciato ILDasm e ho scoperto che il Delegate che VB.NET crea ha lo stesso nome dell'Evento con l'aggiunta di Event percio al posto di ??? bastava mettere TickEvent ovvero
Public
Sub DoClick()
For Each del As [Delegate] In TickEvent.GetInvocationList
del.DynamicInvoke(Nothing)
Next
Se dovesse capitarvi ricordatevi di questo dettaglio....