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<PrecioCambioEventArgs> 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%!");
}
}
}
}