using System; namespace Articulos.Cap04 { // Clase contenedora de los datos del evento de cambio de precio: internal class PrecioCambioEventArgs : EventArgs { public readonly decimal PrecioAnterior; public readonly decimal PrecioNuevo; public PrecioCambioEventArgs(decimal precioAnterior, decimal precioNuevo) { PrecioAnterior = precioAnterior; PrecioNuevo = precioNuevo; } } // Clase que representa un producto (únicamente con su precio). // Clase publicadora (broadcaster): internal class Producto { // Precio del producto: decimal precio; // Evento que dispara cuando hay un cambio de precio del producto: public event EventHandler PrecioCambio; protected virtual void OnPrecioCambio (PrecioCambioEventArgs e) { if (PrecioCambio != null) { PrecioCambio (this, e); } } public decimal Precio { get { return precio; } set { if (precio == value) { return; } decimal precioViejo = precio; precio = value; // Se invoca cuando hay diferencai del precio anterior // con un nuevo precio: OnPrecioCambio (new PrecioCambioEventArgs (precioViejo, precio)); } } } internal class Aplicacion { public static void Main() { Producto producto = new Producto(); // Asignamos un precio nuevo al producto: producto.Precio = 27.10M; // Register with the PrecioChange event: producto.PrecioCambio += PrecioCambio; producto.Precio = 31.59M; } // Método compatible con la firma del delegado genérico. // Este método es invocado de forma indirecta cuando el // evento de cambio de precio se genera: public static void PrecioCambio(object sender, PrecioCambioEventArgs e) { if ((e.PrecioNuevo - e.PrecioAnterior) / e.PrecioAnterior > 0.1M) { Console.WriteLine("¡Alerta, el precio del producto ha incrementado un 10%!"); } } } }