Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何自动生成WPF事件的扩展方法库->;可观测_C#_.net_Wpf_Events_System.reactive - Fatal编程技术网

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

C# 如何自动生成WPF事件的扩展方法库->;可观测,c#,.net,wpf,events,system.reactive,C#,.net,Wpf,Events,System.reactive,这些天来,我几乎只在我的C#WPF应用程序中使用反应式扩展。添加和删除事件处理程序是一种反模式,我完全嫉妒F#events实现IObservable的事实 为了帮助C#开发人员,RX人员提供了以下方法(以及其他一些不同类型的安全性) 就这样吧。这样的扩展方法看起来像 IObservable<MouseEventArgs> MouseMoveObserver(this Canvas This){ return Observable.FromEventPattern<Mou

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

为了帮助C#开发人员,RX人员提供了以下方法(以及其他一些不同类型的安全性)

就这样吧。这样的扩展方法看起来像

IObservable<MouseEventArgs> MouseMoveObserver(this Canvas This){
    return Observable.FromEventPattern<MouseEventHandler, 
    MouseEventArgs>(h => This.MouseMove += h, h => This.MouseMove -= h); 
}
IObservable MouseMoveObserver(此画布此画布){
返回可观察的.FromEventPattern(h=>This.MouseMove+=h,h=>This.MouseMove-=h);
}
这不是火箭科学,我一直在考虑建立一个库,在那里我可以根据需要一次添加一个扩展方法。然而,我相信一些智能cookie可以编写一个T4模板,通过反射处理WPF库中的所有控件,并生成我需要的所有扩展方法。我的问题是


是否有人编写了这样一个代码生成器来将事件映射到上述可观察对象,如果没有,是否有人对如何实现这一点有任何建议?关于.Net反射,我不太擅长,但一些种子代码可能会让我开始学习。

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

var typesToDo = from t in Assembly.GetAssembly(typeof(FrameworkElement)).GetTypes()
                where t.IsSubclassOf(typeof(FrameworkElement)) 
                        && t.IsPublic 
                        && t.GetEvents().Any()
                select t;
然后可以使用
type.GetEvents()
获取每种类型的事件。您返回的EventInfo将允许您查看名称、类型、参数等

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

我把一个和一个放在一起


有些输出可能无法正常工作,我没有全部尝试:)我确实确保它们都已生成,并且至少其中一些工作正常。

您看过ReactiveUi了吗?听起来您想要做的事情和它提供的东西之间有重叠。请参见我是reactiveui上的参与者:)我想将此功能添加到库中。我如何才能将我的声誉打100分给您?与StackOverflow上的WPF相关的最佳答案!
var movingEvents = h.MouseMoveObserver();
IObservable<MouseEventArgs> MouseMoveObserver(this Canvas This){
    return Observable.FromEventPattern<MouseEventHandler, 
    MouseEventArgs>(h => This.MouseMove += h, h => This.MouseMove -= h); 
}
var typesToDo = from t in Assembly.GetAssembly(typeof(FrameworkElement)).GetTypes()
                where t.IsSubclassOf(typeof(FrameworkElement)) 
                        && t.IsPublic 
                        && t.GetEvents().Any()
                select t;