使用.NET Rx观察使用Action事件更改的属性

Dav*_*pak 8 .net c# system.reactive

假设我使用以下界面(假设我们不能改变我们的实现以使其IObservable<T>成为一样IProperty<T>).

public interface IProperty<T> {
    T Value { get; set; }
    event Action ValueChanged;
}
Run Code Online (Sandbox Code Playgroud)

我试图观察T随着值的变化而生成的s 的集合.因为事件被声明为Action而不是标准的.NET事件模式,所以我认为我无法使用Observable.FromEvent(...).

我想出了一个似乎有效的包装器,但作为一个Rx新手,我确信我错过了一些内置的抽象(或者我可能只是做了整件事).

有没有办法使用内置的Rx功能?如果没有,我的包装器是否缺少任何明显的抽象,或者我应该采取完全不同的方法?

//Example wrapper
public class ObservableProperty<T> : IObservable<T> {
    private readonly IProperty<T> _property;
    public ObservableProperty(IProperty<T> property) { _property = property; }

    public IDisposable Subscribe(IObserver<T> observer) {
        Action action = () => observer.OnNext(_property.Value);
        _property.ValueChanged += action;
        return Disposable.Create(() => _property.ValueChanged -= action);
    }
}
Run Code Online (Sandbox Code Playgroud)

Sco*_*ein 11

这应该这样做:

public static class RxExt
{
    public static IObservable<T> FromMyEvent<T>(this IProperty<T> src)
    {
        return System.Reactive.Linq.Observable.Create<T>((obs) =>
        {
            Action eh = () => obs.OnNext(src.Value);
            src.ValueChanged += eh;
            return () => src.ValueChanged -= eh;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我的一个Rx指南是"永远不要直接实现IObservable或IObserver" - 这种限制有助于我找到更简单的方法来构建api (4认同)
  • 给定可以使用它的方式`property.FromMyEvent(...)`,我将方法命名为“ ToObservable”,但除此之外,它看起来像我会做的那样。 (2认同)