tiempo que net llamar eventos evento ejemplo ejecucion desde delegados crear control codigo boton activar vb.net delegates event-handling

vb.net - que - llamar evento click desde codigo c#



AddHandler solo si no hay controladores para este evento? (1)

Quiero configurar un controlador de eventos solo si no está configurado:

If GetHandlers(MyWindow.Closed, AddressOf MyWindow_Closed).Length = 0 Then AddHandler MyWindow.Closed, AddressOf MyWindow_Closed EndIf


Realmente no puede consultar el valor actual del delegado del evento, excepto en el código que define el evento. ¿Cuál es tu intención aquí? Normalmente, ¿no debería preocuparse (necesariamente) con otros suscriptores? Hay formas de piratear la encapsulación para encontrar el valor actual, pero no se recomiendan (simplemente no es una buena idea).

Si le preocupa si ya está manejando ese evento con ese controlador (es decir, si no desea suscribirse por completo, siempre puede: a) corregir el código para que no lo haga o b: hacer trampa (C # ejemplo):

// remove handler **if subscribed**, then re-subscribe myWindow.Closed -= MyWindow_Closed; myWindow.Closed += MyWindow_Closed;

Para obtener la lista de invocación es ... frágil pero factible. En casos simples, puede usar el reflejo para obtener el campo y obtener el valor. Pero con formularios, etc. usa técnicas dispersas (para minimizar el espacio para eventos sin suscriptores). En el caso de FormClosed , esto se codifica mediante EVENT_FORMCLOSED .

Puede tener más sentido con un ejemplo (C #, lo siento):

Form form = new Form(); form.FormClosed += delegate { Console.WriteLine("a");}; // just something, anything form.FormClosed += delegate { Console.WriteLine("b");}; // just something, anything object key = typeof(Form).GetField("EVENT_FORMCLOSED", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); EventHandlerList events = (EventHandlerList ) typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(form, null); FormClosedEventHandler handler = (FormClosedEventHandler)events[key]; foreach (FormClosedEventHandler subhandler in handler.GetInvocationList()) { subhandler(form, null); // access the two events separately }

En el caso de una ObservableCollection<T> , el delegado está directamente en un campo, por lo que se requiere menos indirección:

ObservableCollection<SomeType> list = ... NotifyCollectionChangedEventHandler handler = (NotifyCollectionChangedEventHandler) list.GetType() .GetField("CollectionChanged", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(list);