gpt4 book ai didi

c# - 如何自动生成WPF Event -> IObservable的扩展方法库

转载 作者:太空狗 更新时间:2023-10-30 00:53:52 27 4
gpt4 key购买 nike

这些天我几乎只在我的 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 反射,但一些种子代码可能会让我入门。

最佳答案

要获取从 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 会让您查看名称、类型、参数等内容。

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

我放了一个 example program up on GitHub连同 example of the output .

存在某些输出无法正常工作的风险,我还没有全部尝试 :) 我确实确保它们都已构建,并且至少其中一些可以正常工作。

关于c# - 如何自动生成WPF Event -> IObservable的扩展方法库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909963/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com