public static class Program
static Action<string> exampleEvent;
public static void Main()
var token = exampleEvent.Listen(Console.WriteLine);
exampleEvent?.Invoke("Girls!");
exampleEvent?.Invoke("No more Girls :(");
public static ListenerToken Listen<T>(this Action<T> eventDelegate, Action<T> listenerDelegate){
eventDelegate += listenerDelegate;
return new ListenerToken(eventDelegate, listenerDelegate);
public struct ListenerToken : IDisposable{
public Delegate Listener;
public ListenerToken(Delegate eventDelegate, Delegate listenerDelegate){
Listener = listenerDelegate;
Delegate.Remove(Event, Listener);