2011-05-19 14 views
8

dicen que estoy utilizando la siguiente interfaz (se supone que no podemos cambiar nuestra aplicación para que sea IObservable<T>, así como IProperty<T>).Rx para observar la propiedad cambió con eventos de acción

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

estoy tratando de observar la colección de T s generados como los cambios de valor. Debido a que el evento se declara como Action más que el patrón estándar de .NET caso no creo que pueda usar Observable.FromEvent(...).

He encontrado una envoltura que parece funcionar, pero como novato de Rx estoy seguro de que me faltan algunas abstracciones integradas (o posiblemente estoy haciendo todo mal).

¿Hay alguna manera de hacer esto usando construido en la funcionalidad Rx? Si no, ¿mi envoltorio no contiene abstracciones obvias, o hay un enfoque completamente diferente que debería tomar?

//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); 
    } 
} 

Respuesta

11

Esto debe hacerlo:

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

perfecto! Gracias un montón. ¿Ahora por qué no podría resolver eso? :) –

+4

Una de mis directrices Rx es "no poner en práctica IObservable o IObserver directamente" - que la restricción me ayuda a forzar a encontrar la manera más sencilla w/la estructura en api –

+1

Dada la forma en que esto probablemente será utilizado 'property.FromMyEvent (. ..) ', yo nombraría el método' ToObservable', pero aparte de eso, parece lo que haría. –

Cuestiones relacionadas