2011-05-19 55 views
8

假设我正在使用以下接口(假设我们无法更改我们的实现以使其生效IObservable<T>以及IProperty<T>)。使用.NET Rx观察属性因Action事件而改变

public interface IProperty<T> { 
    T Value { get; set; } 
    event Action ValueChanged; 
} 

我想观察作为价值变动产生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); 
    } 
} 

回答

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; 
     }); 
    } 
} 
+0

完美!谢谢一堆。现在为什么我无法弄清楚? :) – 2011-05-19 12:12:16

+4

我的一个Rx指导方针是“从不直接实现IObservable或IObserver” - 这个限制有助于迫使我找到更简单的方法来构建api – 2011-05-19 12:28:18

+1

考虑到可能会使用这种方法'property.FromMyEvent(。 ..)',我会命名方法'ToObservable',但除此之外,它看起来像我会做的。 – 2011-05-19 17:18:23