using System; using System.Collections.Generic; namespace Syntriax.Engine.Core; public class Event { private readonly List listeners = new(8); public void AddListener(EventHandler listener) => listeners.Add(listener); public void RemoveListener(EventHandler listener) => listeners.Remove(listener); public void Clear() => listeners.Clear(); public void Invoke(TSender argument) { for (int i = 0; i < listeners.Count; i++) try { listeners[i].Invoke(argument); } catch (Exception exception) { string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({argument})"; Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } } public delegate void EventHandler(TSender sender); } public class Event { private readonly List listeners = new(8); public void AddListener(EventHandler listener) => listeners.Add(listener); public void RemoveListener(EventHandler listener) => listeners.Remove(listener); public void Clear() => listeners.Clear(); public void Invoke(TSender sender, TArguments arguments) { for (int i = 0; i < listeners.Count; i++) try { listeners[i].Invoke(sender, arguments); } catch (Exception exception) { string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", sender, arguments)})"; Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } } public delegate void EventHandler(TSender sender, TArguments arguments); }