最近は、C# WPF アプリで Reactive Extensions をほぼ独占的に使用しています。イベント ハンドラーの追加と削除はアンチ パターンであり、F# イベントが IObservable を実装するという事実に完全に嫉妬しています。
C# 開発者を支援するために、RX 関係者は以下の方法を提供しています (およびさまざまなタイプの安全性を持つ他のいくつかの方法)。
public static
IObservable<EventPattern<TEventArgs>>
FromEventPattern<TDelegate, TEventArgs>
( Action<TDelegate> addHandler
, Action<TDelegate> removeHandler
)
where TEventArgs : EventArgs
http://msdn.microsoft.com/en-us/library/hh211731(v=vs.103).aspx
私はそのようにそれを使用します
var movingEvents = Observable.FromEventPattern<MouseEventHandler,
MouseEventArgs>(h => this.MouseMove += h, h => this.MouseMove -= h);
しかし、これは面倒です。できるようになりたいのは
var movingEvents = h.MouseMoveObserver();
そしてそれで終わります。このような拡張メソッドは次のようになります
IObservable<MouseEventArgs> MouseMoveObserver(this Canvas This){
return Observable.FromEventPattern<MouseEventHandler,
MouseEventArgs>(h => This.MouseMove += h, h => This.MouseMove -= h);
}
それはロケット科学ではなく、必要に応じてこれらの拡張メソッドを一度に 1 つずつ追加するライブラリを設定することを検討しています。ただし、リフレクションを介して WPF ライブラリ内のすべてのコントロールを処理し、必要なすべての拡張メソッドを生成する T4 テンプレートをスマート Cookie で作成できると確信しています。私の質問は...
上記のように、イベントをオブザーバブルにマップするコードジェネレーターを書いた人はいますか?私は .Net リフレクションに関してはあまり得意ではありませんが、いくつかのシード コードから始めることができるかもしれません。