type see remarks example cref c# events event-dispatching

see - Cómo enviar eventos en C#



see cref c# (4)

Hay un patrón que se utiliza en todas las clases de la biblioteca. También se recomienda para sus propias clases, especialmente para el código del marco / biblioteca. Pero nadie lo detendrá cuando se desvíe o se salte unos pasos.

Aquí hay un esquema basado en el delegado de eventos más simple, System.Eventhandler .

// The delegate type. This one is already defined in the library, in the System namespace // the `void (object, EventArgs)` signature is also the recommended pattern public delegate void Eventhandler(object sender, Eventargs args); // your publishing class class Foo { public event EventHandler Changed; // the Event protected virtual void OnChanged() // the Trigger method, called to raise the event { // make a copy to be more thread-safe EventHandler handler = Changed; if (handler != null) { // invoke the subscribed event-handler(s) handler(this, EventArgs.Empty); } } // an example of raising the event void SomeMethod() { if (...) // on some condition OnChanged(); // raise the event } }

Y cómo usarlo:

// your subscribing class class Bar { public Bar() { Foo f = new Foo(); f.Changed += Foo_Changed; // Subscribe, using the short notation } // the handler must conform to the signature void Foo_Changed(object sender, EventArgs args) // the Handler (reacts) { // the things Bar has to do when Foo changes } }

Y cuando tengas información para transmitir:

class MyEventArgs : EventArgs // guideline: derive from EventArgs { public string Info { get; set; } } class Foo { public event EventHandler<MyEventArgs> Changed; // the Event ... protected virtual void OnChanged(string info) // the Trigger { EventHandler handler = Changed; // make a copy to be more thread-safe if (handler != null) { var args = new MyEventArgs(){Info = info}; // this part will vary handler(this, args); } } } class Bar { void Foo_Changed(object sender, MyEventArgs args) // the Handler { string s = args.Info; ... } }

Actualizar

Comenzando con C # 6, el código de llamada en el método ''Disparador'' se ha vuelto mucho más fácil, la prueba nula se puede acortar con el operador condicional nulo ?. sin hacer una copia manteniendo la seguridad del hilo:

protected virtual void OnChanged(string info) // the Trigger { var args = new MyEventArgs{Info = info}; // this part will vary Changed?.Invoke(this, args); }

Deseo crear eventos propios y despacharlos. Nunca había hecho esto antes en C #, solo en Flex ... Supongo que debe haber muchas diferencias.

¿Alguien puede darme un buen ejemplo?


Los eventos en C # usan delegados.

public static event EventHandler<EventArgs> myEvent; static void Main() { //add method to be called myEvent += Handler; //call all methods that have been added to the event myEvent(this, EventArgs.Empty); } static void Handler(object sender, EventArgs args) { Console.WriteLine("Event Handled!"); }


Mira en ''delegates''.

  • Definir un delegado
  • Utilice el tipo de delegado como campo / propiedad (agregando la palabra clave ''Evento'')
  • Ahora está exponiendo los eventos que los usuarios pueden conectar con "+ = MyEventMethod";

Espero que esto ayude,


Use el patrón de eventos típico de .NET y suponga que no necesita ningún argumento especial en su evento. Tu patrón típico de evento y envío se ve así.

public class MyClassWithEvents { public event EventHandler MyEvent; protected void OnMyEvent(object sender, EventArgs eventArgs) { if (MyEvent != null) { MyEvent(sender, eventArgs); } } public void TriggerMyEvent() { OnMyEvent(sender, eventArgs); } }

Atar algo al evento puede ser tan simple como:

public class Program { public static void Main(string[] args) { MyClassWithEvents obj = new MyClassWithEvents(); obj.MyEvent += obj_myEvent; } private static void obj_myEvent(object sender, EventArgs e) { //Code called when my event is dispatched. } }

Eche un vistazo a los enlaces en esta página de MSDN