简体   繁体   English

Observable.FromEventPattern(addHandler,removeHandler)-简化吗?

[英]Observable.FromEventPattern(addHandler, removeHandler ) - simplification?

When creating an observable from an event, it looks like the following is the most common way: 从事件创建可观察对象时,以下是最常见的方法:

var o = Observable.FromEventPattern(h => source.Event += h,
                                    h => source.Event -= h);

I find this form a little tedious in some cases where I would like to handle multiple events in the same way. 在某些情况下,我希望以相同的方式处理多个事件,因此这种形式有点乏味。 But that doesn't look to easy, since the event it self seems impossible to parameterize, as shown in this non-compiling code: 但这看起来并不容易,因为事件本身似乎无法进行参数化,如下面的非编译代码所示:

private IObservable MakeAnObservableFromThisEvent(Event event)
{
    return Observable.FromEventPattern(h => event += h,
                                        h => event -= h);

}

private void MakeAlotOfObservables(object source)
{
    MakeAnObservableFromThisEvent(source.OneEvent);
    MakeAnObservableFromThisEvent(source.AnotherEvent);
    MakeAnObservableFromThisEvent(source.ThirdEvent);

    //or even
    MakeAnObservableFromThisEvent(() => source.ThirdEvent);
}

Of cause there is the 'event name'-overload: 原因是“事件名称”超载:

var o = Observable.FromEventPattern< >(source, "Event");

but then there is this thing with more or less magic strings... 但是这东西或多或少都有魔力弦...

Is there away of optimizing this code? 是否有优化此代码的余地? Or is this just the way things are? 还是这就是事情的样子?

The problem is that event handlers have "value-type" semantics (like strings) and so passing them as parameters is only useful if you intend to invoke them. 问题在于事件处理程序具有“值类型”语义(例如字符串),因此仅当您打算调用它们时将它们作为参数传递才有用。 Adding new handlers effectively creates a new delegate instance and the original is not modified. 有效地添加新的处理程序会创建一个新的委托实例,并且原始实例不会被修改。

Then only really viable method to add and remove handlers and maintain type safety at the same time is with the syntax you showed first in your question. 然后,唯一真正可行的方法是同时添加和删除处理程序并保持类型安全,这是您在问题中首先显示的语法。

var o =
    Observable
        .FromEventPattern(
            h => source.Event += h,
            h => source.Event -= h);

However, there is another option that I've used quite a bit - and that's using extension methods. 但是,还有一个我使用了很多选项的方法-使用扩展方法。

If I have this class: 如果我有这堂课:

public class Foo
{
    public event EventHandler<EventArgs> Click;
}

I can write an extension method: 我可以写一个扩展方法:

public static class FooEx
{
    public static IObservable<EventPattern<EventArgs>> Clicks(this Foo source)
    {
        return
            Observable
                .FromEventPattern<EventArgs>(
                    h => source.Click += h,
                    h => source.Click -= h);
    }
}

That then allows me to write this: 然后,我可以这样写:

var foo = new Foo();
foo.Clicks().Subscribe(x => Console.WriteLine("Click!"));

You effectively write the extension method once per type and event and then can use it where ever you need to with a much improved syntax. 您可以为每个类型和事件有效地编写一次扩展方法,然后可以在需要时使用它,并使用大大改进的语法。

It's not really a direct solution, but the ReactiveUI-Events basically implements what @Enigmativity suggests for the entire framework. 这并不是一个直接的解决方案,但是ReactiveUI-Events基本上实现了@Enigmativity对整个框架的建议。 So you can do something like: 因此,您可以执行以下操作:

Observable.Merge(
    Foo.Events().Clicked.Select(_ => Unit.Default),
    Foo.Events().KeyUp.Select(_ => Unit.Default));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Observable.fromEventPattern TypedEventHandler - Observable.fromEventPattern TypedEventHandler ObservableCollection上的Observable.FromEventPattern - Observable.FromEventPattern on ObservableCollection 用 Observable.Create 包裹 Observable.FromEventPattern - Wrap Observable.FromEventPattern with Observable.Create 为什么Observable.FromEventPattern接受调度程序? - Why Observable.FromEventPattern take in a scheduler? 何时使用Observable.FromEventPattern而不是Observable.FromEvent? - When to use Observable.FromEventPattern rather than Observable.FromEvent? 使用Observable.FromEventPattern在不活动或计数后执行操作 - Use Observable.FromEventPattern to perform action after inactivity or count 如何将SelectMany用于Observable.FromEventPattern序列上的异步逻辑? - How to use SelectMany for async logic on Observable.FromEventPattern sequence? 您如何向Observable.FromEventPattern中使用的事件注册/注销处理程序? - How do you register/unregister handlers to the event used in Observable.FromEventPattern? 在 Reactive Extensions for .NET 中使用 Observable.FromEventPattern 时如何避免任何阻塞? - How can I avoid any blocking when using Observable.FromEventPattern in Reactive Extensions for .NET? 当使用TestScheduler将事件触发到具有ObserveOn的Observable.FromEventPattern时,在下一个事件被触发之前不会观察到事件 - When using TestScheduler to fire events into Observable.FromEventPattern that has an ObserveOn, the events aren't observed until next event is fired
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM