C# 行为主体行为来自IObservable
我希望获得与从C# 行为主体行为来自IObservable,c#,.net,system.reactive,C#,.net,System.reactive,我希望获得与从BehaviorSubject从IObservable获得的行为相同的行为 当我执行.Take(1)时,我希望它返回“默认值”,直到基础IObservable更改它。基本的IObservable“泵”一次并完成 我不希望实际使用行为主体(这会使它变得微不足道),因为我认为这是一种糟糕的形式 这可能吗?公共静态IObservable行为(IObservable源) public static IObservable<T> Behaviour<T>(IObser
BehaviorSubject
从IObservable
获得的行为相同的行为
当我执行.Take(1)
时,我希望它返回“默认值”,直到基础IObservable
更改它。基本的IObservable
“泵”一次并完成
我不希望实际使用行为主体
(这会使它变得微不足道),因为我认为这是一种糟糕的形式
这可能吗?公共静态IObservable行为(IObservable源)
public static IObservable<T> Behaviour<T>(IObservable<T> source)
{
return Observable.Return(default(T)).TakeUntil(source).Concat(source);
}
{
返回可观察。返回(默认值(T)).TakeUntil(源)。Concat(源);
}
如果希望流始终具有初始值,则可能需要使用.StartWith()
方法
在引擎盖下,除了没有.TakeUntil()
之外,这将做一些与Lee的答案非常相似的事情
如果您希望订阅者立即收到最后一个值,您可能需要将其与
.Replay(1)
结合使用。如果行为主题
完全符合您的要求,为什么它是不好的形式?如果你愿意,它可以被公开为一个IObservable
。@MatthewFinlay-这只是个人的观点,但是订阅IObservable
只是为了在中注入主题
。subscribe
方法并不真正适合将IObservable
链接在一起的RX范例Subject
s应该只在你的接收链IMO的最开始处。如果它是一个热可观察对象,并且有人在源启动后订阅,那么它的行为就不会完全像BehaviorSubject
。他们不会立即得到一个值,而BehaviorSubject
会立即返回最新的值。所以我的答案是:observable.StartWith(defaultValue)。Replay(1)
。对于任何正在寻找的人,请注意这将是热的,因此需要适当处理。