Использование .NET Rx для наблюдения за изменением свойства с событиями Action - PullRequest
8 голосов
/ 19 мая 2011

Скажем, я использую следующий интерфейс (предположим, что мы не можем изменить нашу реализацию, чтобы сделать ее IObservable<T>, а также IProperty<T>).

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

Я пытаюсь наблюдать за коллекциейT с генерируется при изменении значения.Поскольку событие объявлено как 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);
    }
}

1 Ответ

11 голосов
/ 19 мая 2011

Это должно сделать это:

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