2012-09-28 13 views

Respuesta

10

Si esto es todo dentro de una sola clase, se puede hacer un método para provocar el evento que trabaja con cualquiera de ellos. Por ejemplo, si sus eventos todos eran EventHandler<T>, que puede usar:

private void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs) 
{ 
    if (eventHandler != null) 
    { 
     eventHandler(this, eventArgs); 
    } 
} 

A continuación, podría llamar a esto a través de:

this.RaiseEvent(this.MyEvent, new MyEventArgs("Foo")); 
+0

con esta implementación, ¿hay alguna necesidad de poner el controlador en una variable local antes de comprobar nulo para evitar la condición de carrera? –

+0

@ mohsen.d No hay condiciones de carrera. eventHandler es un parámetro. – CrazyCasta

+0

@Reed Copsey, disculpe, pero ¿puede explicarme un poco más? gracias –

-1

Ver this. Describe lo que quieres

puede crear un evento con teclado utilizando un delegado escrito y el uso que para su evento:

public delegate void myDel<T>(T stuff); 

public event myDel<int> myEvent; 

public doStuff() 
{ 
    myDel(1); 
} 
+1

No sólo que no parece hacer lo que quiere el OP, no es apropiado en SO a * solo * enviar un enlace, incluso si lo hace responder a la pregunta. [más información] (http://meta.stackexchange.com/questions/94022/how-can-i-link-to-an-external-resource-in-a-community-friendly-way) – Servy

1

para una versión estática de la respuesta de Reed Copsey, he creado una clase estática Event :

public static class Event 
{ 
    public static bool Raise<T>(Object source, EventHandler<T> eventHandler, T eventArgs) where T : EventArgs 
    { 
     EventHandler<T> handler = eventHandler; 
     if (handler != null) 
     { 
      handler(source, eventArgs); 
      return true; 
     } 
     return false; 
    } 
} 

Esto también asume sus controladores de eventos son del tipo EventHandler<T>. El tipo de devolución se cambió de void a bool y devuelve si hubo oyentes del evento. Rara vez se usa, así que siéntete libre de volver a cambiar al void.

Ejemplo de uso:

public event EventHandler<FooArgs> FooHappend; 

public void Foo() 
{ 
    Event.Raise(this, FooHappend, new FooArgs("Hello World!"); 
} 
Cuestiones relacionadas