All delegate events are refactored to use the Event<TSender> and Event<TSender, TArgument> for performance issues regarding delegate events creating garbage, also this gives us better control on event invocation since C# Delegates did also create unnecessary garbage during Delegate.DynamicInvoke
47 lines
1.9 KiB
C#
47 lines
1.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Syntriax.Engine.Core;
|
|
|
|
public class Event<TSender>
|
|
{
|
|
private readonly List<EventHandler> 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<TSender, TArguments>
|
|
{
|
|
private readonly List<EventHandler> 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 args)
|
|
{
|
|
for (int i = 0; i < listeners.Count; i++)
|
|
try { listeners[i].Invoke(sender, args); }
|
|
catch (Exception exception)
|
|
{
|
|
string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", sender, args)})";
|
|
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
|
|
}
|
|
}
|
|
|
|
public delegate void EventHandler(TSender sender, TArguments args);
|
|
}
|