2016年8月20日土曜日

[C#]動的にイベントハンドラーを追加/削除する

イベントハンドラをReflectionを用いて動的に追加・削除する方法を紹介します。

いきなりソースコード。↓↓↓

---

public class test1
{
    public test1()
    {
        var m3 = typeof(test1).GetEvents()[0];
        var z3 = typeof(test1).GetMethod(nameof(func1), BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
        var x3 = z3.CreateDelegate(typeof(EventHandler), this);

        m3.AddEventHandler(this, x3);
        Notification("foo");

        m3.RemoveEventHandler(this, x3);
        Notification("bar");
    }
    public event EventHandler Event1;
    void Notification(string s) => Event1?.Invoke(this, s);
    void func1(object o, string s) => Console.WriteLine(s);
}

---

イベントハンドラは身近なところでいうと、WinFormでいうとボタンイベントなどに
使われていて、おおむね1:1の関係で使用されていますが1:Nとして使用することもできます。

1:Nができると何がいいかというと、1つのイベントをN箇所に通知する事ができるのでObserverパターン的な使い方が可能になるということです。

プログラムデザインでいえばList型のような1:Nの関係性がある時、変化を全体に通知したい場合などに使用するととても効果的です。


コメントを投稿

Androider