C# 如何设置可观察对象来观察属性?

C# 如何设置可观察对象来观察属性?,c#,system.reactive,C#,System.reactive,我意识到这可能是一个非常愚蠢的问题,但是关于反应式扩展的文档既不透明又分散 假设我有一节课 public class Foo { public int FooState {get;set;} } 而且FooState的更新非常频繁。这看起来是IObservable的理想情况,特别是因为我必须在另一个类中跟踪该状态 public class Bar { public Foo Foo {get;set;} private void DoStuffWithFooState(

我意识到这可能是一个非常愚蠢的问题,但是关于反应式扩展的文档既不透明又分散

假设我有一节课

public class Foo
{
    public int FooState {get;set;}
}
而且FooState的更新非常频繁。这看起来是IObservable的理想情况,特别是因为我必须在另一个类中跟踪该状态

public class Bar
{
    public Foo Foo {get;set;}

    private void DoStuffWithFooState()
    {
        //operate on Foo.FooState here
    }
}
现在,我不能将FooState更改为IObservable,因为这会破坏其他依赖于Foo的东西

我想做的是在监视FooState的条上声明一个IObserver属性

这不是一个基本的用例吗?我该怎么做呢?

您可以使用将属性转换为可观察的流和可以读取最新值的属性

public class Foo
{
    private readonly BehaviorSubject<int> _fooSubject = new BehaviorSubject<int>(0);
    public int FooState
    {
        get => _fooSubject.Value;
        set => _fooSubject.OnNext(value);
    }
    public IObservable<int> ObservableFooState => _fooSubject;
}
请注意,一个常见的错误是使用,然后想知道为什么你几乎从来没有得到任何事件!(原因是每次新事件到达时,节流阀都会重置超时,因此当流频繁更新时,您将永远不会超过超时值。)

虽然它很旧,而且在某些方面有点过时,但我发现它在尝试学习反应式时非常有用。虽然更旧、更过时,但仍然是一个非常有用的概念性介绍-只是不要将代码示例太过字面化

如果这个类实际上是一个ViewModel,你可能想考虑一下,但是我建议你避开它,直到你对反应非常满意。


注意,我没有在上面显示Dispose/Completion逻辑。你应该考虑什么时候(如果有)你想调用一个完整的子对象。还请记住,您可能希望确保在订户超出范围时处理它们

谢谢大家!!该类不是viewmodel,它是由外部服务操作的对象的内存缓存的一部分。您最初的问题是是否确实不需要更改Foo。这回答了你的问题吗?回答了,因为你的回答保留了Foo的签名。非常感谢。
//print out value every two seconds
foo.ObservableFooState
   .Sample(TimeSpan.FromSeconds(2)) 
   .Subscribe(Console.WriteLine);