管理人の技術ブログです。イベントのシーケンス化で.NETネイティブなイベントをIObservable<T>に変換する方法について触れました。「.NETイベントをIObservable<T>に変換できるなら、その逆もできていいんじゃないか?」と思った方、正解です!今回はIObservable<T>を.NETイベントに変換する方法について説明します。.NETイベントをIObservable<T>に変換したときは、FromEventメソッドもしくはFromEventPatternメソッドを利用しました。今回はその逆なので、メソッド名もToEventメソッドとToEventPatternメソッドです。覚えやすいですね!Action<T>型のイベントを発行するひとつめは、Action<T>型のイベントに変換する場合に利用するObservable.ToEventメソッドです。簡単なサンプルを見てみましょう。今回もまたデジタル時計を作ってみました。}}まず、コンストラクタでObservable.Timerメソッドを利用して1秒おきに現在の時刻を発行しています。その最後にToEventメソッドでIEventSource<T>に変換しているのが今回のポイントです。IEventSource<T>はAction<T>型のOnNextイベントを持っているだけのインターフェースで、値がOnNextメソッドで通知されたのに呼応してイベントを発行するという機能を持っています。IEventSource<T>がIObservable<T>と.NETイベントとの間を取り持ってくれるアダプターになっているということです。Clockクラスの外部には標準的な.NETイベントとして公開したいので、TimeChangedイベントとしてラップしています。準備ができたので、これを利用してみます。}}特に何という事もなくイベントハンドラを追加して時間を表示しているだけです。ポイントは、Clockクラスの外部から見た場合に内部でRxが利用されていることが隠蔽されていて見えないことです。内部ではガリガリ/ゴリゴリRxを使っていても、公開するインターフェースはイベントという形でシンプルにできます。上手く使いこなして美しいクラス設計をしたいですね!EventHandler<T>型のイベントを発行するもうひとつ、EventHandler<T>型のイベントを発行するObservable.ToEventPatternメソッドを紹介します。イベントの型が異なるだけで、基本的にはObservable.ToEventメソッドと同じです。以下にサンプルを示します。今回の例題は、イベントが呼び出された回数を通知するという簡単なものです。イベントデータ型を定義します。}}次に、イベントを発行するクラスを定義します。}}今回も前のサンプルと同様にコンストラクタでToEventPatternメソッドを呼び出し、IObservable<T>と.NETイベントのアダプターであるIEventPatternSource<T>に変換しています。ToEventPatternメソッドに与えられる型はIObservable<EventPattern<TEventArgs>>です。イベントのシーケンス化でもチラッと出てきましたが、イベントの送り主とイベントデータをまとめるためのクラスです。RaiseEventメソッドで発行回数をインクリメントしながら値を通知し、通知が行くとコンストラクタで定義した変換が行われ、最終的にはNotifyCountイベントが発行される、という流れになります。最後に、これらを使って実行してみます。イベントが発行され、回数が通知されていることが確認できますね。結果/*1回目2回目3回目*/ここでは、イベントの型としてEventHandler<T>型を利用しました。場合によってはEventHandler型を利用したいケースがあるかもしれませんが、RxにはEventHandler型に直接変換するためのメソッドが用意されていません。必要であるならば、EventHandler<EventArgs>として対応してください。(1)月別アーカイブはてなブログをはじめよう!xin9leさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。