카테고리 없음

C# EventHandler Dictionary

작은이야기 2019. 7. 9. 15:32
using System;
using System.Collections.Generic;

namespace ConsoleApp3.EventHandler
{
  public class MyEventHandlerDic
  {
    private Dictionary> dic
      = new Dictionary>();

    public void Register(int key, EventHandler newHandler)
    {
      if (this.dic.ContainsKey(key))
      {
        this.dic[key] += newHandler;
      }
      else
      {
        this.dic.Add(key, newHandler);
      }
    }

    public void Unregister(int key, EventHandler newHandler)
    {
      if (this.dic.ContainsKey(key))
      {
        this.dic[key] -= newHandler;
      }
    }

    public void Run()
    {
      foreach (var keyValue in this.dic)
      {
        keyValue.Value?.Invoke(null, keyValue.Key);
      }
    }
  }

  public class Runner
  {
    public int Key { get; set; }
    public void Update(object obj, int arg)
    {
      Console.WriteLine($"key:{this.Key} arg:{arg}");
    }
  }

  public static class EventHandlerTest
  {
    public static void Run()
    {
      var handlerDic = new MyEventHandlerDic();
      Runner r1 = new Runner { Key = 1 };
      Runner r2 = new Runner { Key = 2 };
      Runner r3 = new Runner { Key = 3 };
      Runner r4 = new Runner { Key = 4 };
      Runner r5 = new Runner { Key = 5 };

      handlerDic.Register(1, r1.Update);
      handlerDic.Register(1, r2.Update);
      handlerDic.Run();
      Console.WriteLine(1);

      handlerDic.Unregister(1, r2.Update);
      handlerDic.Run();
      Console.WriteLine(2);

      handlerDic.Unregister(1, r1.Update);
      handlerDic.Run();
      Console.WriteLine(3);

      handlerDic.Register(2, r2.Update);
      handlerDic.Register(3, r3.Update);
      handlerDic.Run();
      Console.WriteLine(4);
      
    }

  }
}
key:1 arg:1
key:2 arg:1
1
key:1 arg:1
2
3
key:2 arg:2
key:3 arg:3