这些天来,我几乎只在我的 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);
}
这不是火箭科学,我一直在考虑建立一个库,在我需要时一次添加这些扩展方法。但是我确信一些智能 cookie 可以编写一个 T4 模板,通过反射处理 WPF 库中的所有控件并生成我需要的所有扩展方法。我的问题是...
有没有人写过这样的代码生成器来将事件映射到上面的可观察对象,如果没有,有人会对如何做到这一点有任何建议吗?我对 .Net 反射不是很好,但一些种子代码可能会让我开始。