在 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
的实例,有一个事件,SomeEvent
。 ClassWithEvent
对象会定期更改。我需要 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());
我有一个 class ClassWithProperty
,其中包含一个 属性、SomeProperty
,这是另一个 class、ClassWithEvent
的实例,有一个事件,SomeEvent
。 ClassWithEvent
对象会定期更改。我需要 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());