Explicaremos la manera de crear eventos personalizados en C#, pero para hacerlo más comprensible, nos situaremos en un ejemplo de un caso práctico como podría ser crear una librería, la cual tendrá diferentes funcionalidades y necesita generar información de log de aquello que realice así como posibles errores. Al ser una librería no resulta lógico por razones de portabilidad el que ella misma grabe log en un fichero, que sería tarea del código que consumiese esa librería, por tanto en este caso resulta perfecto el crear un evento para generar información de log dentro de la librería.
Evento personalizado en una librería.
Pongamos una clase imaginaria de funcionalidad general llamada Funciones.dll que contiene la clase Func, la cual tendrá un evento llamado Logging que devolverá información al dispararse.
Lo primero será declarar un evento público y un método delegado para relacionarlo, el cual contendrá 2 parámetros, el mensaje de log y el tipo de error. Estos parámetros del evento serán personalizados según el uso del evento.
public enum TipoLog { Info = 0, Alerta = 2, Err = 1 }; public delegate void MyEventLog(string Msg, TipoLog Tipo); public event MyEventLog Logging;
Un quebradero típico al comenzar con los eventos, más si son personalizados, es la necesidad de comprobar que el evento tiene subcriptor, es decir, que la clase, código o aplicación que consuma la librería esté suscrita al evento, de lo contrario se producirá un error.
/// <summary> /// Checkeamos que haya subcriptores al evento y no sea nulo. /// </summary> /// <param name="Msg">Mensaje de Log.</param> protected virtual void LogMsg(string Msg, TipoLog Tipo) { MyEventLog tmp = Logging; if (tmp != null) tmp(Msg, Tipo); }
Una vez realizdo este paso necesario, ya simplemente llamamos ese método cada vez que queramos lanzar el evento. De esta manera, desde cualquier punto de la librería que queramos disparar el evento personalizado, simplemente tendriamos que invocar el método anterior:
LogMsg("Este es un mensaje de prueba.", TipoLog.Err);
Consumir el evento.
Cualquier código que instancie la librería anterior, puede querer consumir el evento de Logging si necesita guardar la información de proceso de la librería. Así que desde donde se necesite, se instancia la librería, después la clase y se suscribe esta al evento, generándo un método que controle el resultado disparado por el evento:
Func comun = new Func(); comun.Logging += comun_Logging;
El método que controlará el evento:
/// <summary> /// Recibe el evento Logging de la DLL Funciones.dll /// </summary> /// <param name="Msg">Mensaje de Log.</param> /// <param name="Tipo">Tipologia del log.</param> static void comun_Logging(string Msg, Func.TipoLog Tipo) { // Aqui podriamos grabar el log a un fichero, mandar un mail // si es un error o cualquier otra cosa que necesitemos. }
Y eso es todo, evento listo y funcionando.
11112 visitas.
Excelente aporte!!
Muchas gracias por tan concisa y útil explicación, y por hacer sencillo lo complejo.