如何自动生成WPF事件的扩展方法库->;I可观察

本文关键字:gt 观察 方法库 自动生成 WPF 事件 扩展 | 更新日期: 2023-09-27 17:59:44

这些天我几乎只在C#WPF应用程序中使用反应式扩展。添加和删除事件处理程序是一种反模式,我完全嫉妒F#事件实现IOobservable这一事实。

为了帮助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反射方面不是很好,但一些种子代码可能会让我开始。

如何自动生成WPF事件的扩展方法库->;I可观察

要获得从FrameworkElement派生的所有类型,可以使用

var typesToDo = from t in Assembly.GetAssembly(typeof(FrameworkElement)).GetTypes()
                where t.IsSubclassOf(typeof(FrameworkElement)) 
                        && t.IsPublic 
                        && t.GetEvents().Any()
                select t;

然后可以使用CCD_ 1来获取每种类型的事件。您返回的EventInfo会让您查看名称、类型、参数等信息。

您需要做一些额外的工作来处理一般事件,但这并不是一个巨大的工作量。

我在GitHub上放了一个示例程序和一个输出示例。

有些输出可能无法正常工作,我还没有全部尝试:)我确实确保了它们都能构建,并且至少有一些能正确工作。