在Reactive C#中,是否有更好的方法来管理对更改对象事件的单个预订?

问题描述

我有一个ClassWithProperty,其中包含属性SomeProperty,该属性是另一个ClassWithEvent的实例,并带有事件SomeEventClassWithEvent对象将定期更改。我需要ClassWithPropertyClassWithEvent中保留对事件的单个更新订阅

到目前为止,我已经提出了一种方法

public ClassWithproperty()
{
    Idisposable subscription = null;

    this
        .WhenAnyValue(x => x.someProperty)
        .Do(x => subscription?.dispose())
        .Where(x => x != null)
        .Subscribe(x => subscription = 
            Observable.FromEventPattern(x,nameof(x.someEvent))
            .Subscribe(y => SomeMethod()));
}

解决方案确实有效,但是在某种程度上它并不像惯用的Reactive代码,而且对于我认为应该解决一个相当典型的问题,它似乎也有些冗长。在Reactive中,有没有更好的方法解决此类问题?

解决方法

使用Switch运算符非常简单,该运算符切换到IObservable<IObservable<T>>的最新生成的内部可观察值。它处理以前的订阅,并且只为您提供最新的可观察值。

    IDisposable subscription =
        this
            .WhenAnyValue(x => x.SomeClass)
            .Select(x => Observable.FromEventPattern(x,nameof(x.SomeEvent)))
            .Switch()
            .Subscribe(x => SomeMethod());

如果SomeClass可以是null(您的原始代码建议),那么您可以这样做:

    IDisposable subscription =
        this
            .WhenAnyValue(x => x.SomeClass)
            .Select(x =>
                x == null
                    ? Observable.Never<EventPattern<object>>()
                    : Observable.FromEventPattern(x,nameof(x.SomeEvent)))
            .Switch()
            .Subscribe(x => SomeMethod());

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...