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

Is there a better way to manage a single subscription to a changing object's event in Reactive C#?

我有一个 class ClassWithProperty,其中包含一个 属性、SomeProperty,这是另一个 class、ClassWithEvent 的实例,有一个事件,SomeEventClassWithEvent 对象会定期更改。我需要 ClassWithProperty 来保持对 ClassWithEvent 中事件的单个更新订阅。

到目前为止我想出了一种方法:

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());