// using System; using System.Collections; using System.Collections.Generic; [assembly: CLSCompliant(true)] public class TemperatureChangedEventArgs : EventArgs { private Decimal originalTemp; private Decimal newTemp; private DateTimeOffset when; public TemperatureChangedEventArgs(Decimal original, Decimal @new, DateTimeOffset time) { originalTemp = original; newTemp = @new; when = time; } public Decimal OldTemperature { get { return originalTemp; } } public Decimal CurrentTemperature { get { return newTemp; } } public DateTimeOffset Time { get { return when; } } } public delegate void TemperatureChanged(Object sender, TemperatureChangedEventArgs e); public class Temperature { private struct TemperatureInfo { public Decimal Temperature; public DateTimeOffset Recorded; } public event TemperatureChanged TemperatureChanged; private Decimal previous; private Decimal current; private Decimal tolerance; private List tis = new List(); public Temperature(Decimal temperature, Decimal tolerance) { current = temperature; TemperatureInfo ti = new TemperatureInfo(); ti.Temperature = temperature; tis.Add(ti); ti.Recorded = DateTimeOffset.UtcNow; this.tolerance = tolerance; } public Decimal CurrentTemperature { get { return current; } set { TemperatureInfo ti = new TemperatureInfo(); ti.Temperature = value; ti.Recorded = DateTimeOffset.UtcNow; previous = current; current = value; if (Math.Abs(current - previous) >= tolerance) raise_TemperatureChanged(new TemperatureChangedEventArgs(previous, current, ti.Recorded)); } } public void raise_TemperatureChanged(TemperatureChangedEventArgs eventArgs) { if (TemperatureChanged == null) return; foreach (TemperatureChanged d in TemperatureChanged.GetInvocationList()) { if (d.Method.Name.Contains("Duplicate")) Console.WriteLine("Duplicate event handler; event handler not executed."); else d.Invoke(this, eventArgs); } } } public class Example { public Temperature temp; public static void Main() { Example ex = new Example(); } public Example() { temp = new Temperature(65, 3); temp.TemperatureChanged += this.TemperatureNotification; RecordTemperatures(); Example ex = new Example(temp); ex.RecordTemperatures(); } public Example(Temperature t) { temp = t; RecordTemperatures(); } public void RecordTemperatures() { temp.TemperatureChanged += this.DuplicateTemperatureNotification; temp.CurrentTemperature = 66; temp.CurrentTemperature = 63; } internal void TemperatureNotification(Object sender, TemperatureChangedEventArgs e) { Console.WriteLine($"Notification 1: The temperature changed from {e.OldTemperature} to {e.CurrentTemperature}"); } public void DuplicateTemperatureNotification(Object sender, TemperatureChangedEventArgs e) { Console.WriteLine($"Notification 2: The temperature changed from {e.OldTemperature} to {e.CurrentTemperature}"); } } //