最近のReactive ExtensionsにはToEventというのがあるのを知りました(via Reactive Extensions再入門 その15「To*****系メソッド」 – かずきのBlog@Hatena)。調べてみるとToEventPatternがあることも分かりました。「これってもしかしてIObservable<T>から.NETのイベントを発行するのに使えるのではないか」と思い、早速試してみたところうまくいきました。

class Program
{
    static void Main()
    {
        var t = new Test();
 
        t.Hoge += (sender, e) => Console.WriteLine("Hoge event!");
        t.FireHoge();
        t.FireHoge();
    }
}
 
class Test
{
    public Test()
    {
        ee = se.Select(e => new EventPattern<EventArgs>(this, e)).ToEventPattern();
    }
 
    public void FireHoge()
    {
        se.OnNext(EventArgs.Empty);
    }
 
    readonly Subject<EventArgs> se = new Subject<EventArgs>();
    readonly IEventPatternSource<EventArgs> ee;
 
    public event EventHandler<EventArgs> Hoge
    {
        add
        {
            ee.OnNext += value;
        }
        remove
        {
            ee.OnNext -= value;
        }
    }
}

内部ではRxガンガン使うけど、表向きには.NETのイベントとして公開したいという場合に便利ですね。Windows Phone標準搭載のAPIにもこれ欲しかったです。

参考: Observable.ToEventPattern(TEventArgs) Method (System.Reactive.Linq) (MSDN Library)

スポンサード リンク

この記事のカテゴリ

  • ⇒ IObservable<T>から.NETのeventに変換する
  • ⇒ IObservable<T>から.NETのeventに変換する