tengo la línea siguiente en C#:¿Cómo invocar manualmente un evento?
_timer.ElapsedTick += _somefunction1;
_timer.ElapsedTick += _somefunction2;
_timer.ElapsedTick += _somefunction3;
cómo invocar todos los métodos suscritos a _timer.ElapsedTick sin especificar el _somefunction? En algún lugar a lo largo de esta pseudo-línea
invoke(_timer.ElapsedTick);
Su ayuda es muy apreciada.
actualización
Ejemplo de @ M.Babcock está trabajando. El método FireEvent hace la magia. Gracias.
class InvokeFromMe
{
public event EventHandler RaiseMe;
}
class MainClass
{
public MainClass()
{
InvokeFromMe fromMe = new InvokeFromMe();
fromMe.RaiseMe += fromMe_RaiseMe;
fromMe.RaiseMe += fromMe_RaiseMe1;
FireEvent(fromMe, "RaiseMe", null, EventArgs.Empty);
//works
System.Timers.Timer _timer = new System.Timers.Timer();
_timer.Elapsed += _timer_Elapsed;
FireEvent(_timer, "onIntervalElapsed", null, null);
//throws exception
}
private void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("_timer_Elapsed raised");
}
private void fromMe_RaiseMe(object sender, EventArgs e)
{
Console.WriteLine("Event Handler 0 Raised");
}
private void fromMe_RaiseMe1(object sender, EventArgs e)
{
Console.WriteLine("Event Handler 1 Raised");
}
public void FireEvent(object onMe, string invokeMe, params object[] eventParams)
{
MulticastDelegate eventDelagate =
(MulticastDelegate)onMe.GetType().GetField(invokeMe,
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic).GetValue(onMe);
Delegate[] delegates = eventDelagate.GetInvocationList();
foreach (Delegate dlg in delegates)
{
dlg.Method.Invoke(dlg.Target, eventParams);
}
}
}
class Program
{
static void Main(string[] args)
{
MainClass m = new MainClass();
}
}
¡El FireEvent es exactamente lo que estoy buscando, casi! Actualmente me está dando un FieldInfo = null en el GetField. ¿Me estoy perdiendo un BindingFlag? El evento de destino es System.Timer.Timer.ElapsedTick. Los métodos de alguna función son actualmente privados, pero puedo cambiarlos a internos o públicos. –
@JesonMartajaya - ¿Quiere decir 'System.Timers.Timer.Elapsed'? Esto no funcionará si el evento es privado. Sin embargo, los controladores de eventos pueden ser privados. –
@JesonMartajaya - ¿Puedo ver su llamada a 'FireEvent'? Siempre que 'onMe' sea una instancia de' System.Timer.Timer', entonces debería pasar 'ElapsedTick' para 'invokeMe'. También actualizaré mi respuesta para cubrir el caso donde el evento es 'público'. –