如何解决在Reactive C#中,是否有更好的方法来管理对更改对象事件的单个预订?
我有一个类ClassWithProperty
,其中包含属性SomeProperty
,该属性是另一个类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());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。