Есть ли более элегантный способ объединения наблюдаемых, когда тип возвращаемого значения не важен?

У меня есть модель представления, похожая на ReactiveUI. У этого есть несколько свойств различных типов, которые стреляют NotifyPropertyChanged события, и я хочу подписать метод, который будет вызываться, когда любой запущен, но меня не интересуют фактические значения.

Мой текущий код немного некрасив (из-за непрозрачности true выбирает). Есть ли способ выразить это, что показывает намерение просто заботиться о том, когда происходит событие?

    this.ObservableForProperty(m => m.PropertyOne)
        .Select(_ => true)
        .Merge(this.ObservableForProperty(m => m.PropertyTwo).Select(_ => true))
   .Subscribe(...)

Я объединяю около 8 объектов, так что это ужаснее, чем показано.

2 ответа

Решение

Поскольку это выглядит как ReactiveUI, как насчет использования оператора WhenAny:

this.WhenAny(x => x.PropertyOne, x => x.PropertyTwo, (p1, p2) => Unit.Default)
    .Subscribe(x => /* ... */);

В общем, если бы вы комбинировали произвольные Observables, вы могли бы также написать это немного более четко, используя метод без расширения:

Observable.Merge(
    this.ObservableForProperty(x => x.PropertyOne).Select(_ => Unit.Default),
    this.ObservableForProperty(x => x.PropertyTwo).Select(_ => Unit.Default),
    this.ObservableForProperty(x => x.PropertyThree).Select(_ => Unit.Default)
).Subscribe(x => /* ... */);

Кроме того, если вы подписываетесь на каждое свойство ReactiveObject, вероятно, лучше просто использовать:

this.Changed.Subscribe(x => /* ... */);

Вы можете сделать это методом расширения, чтобы сделать намерение более понятным:

public static IObservable<bool> IgnoreValue<T>(this IObservable<T> source)
{
    return source.Select(_ => true);
}

...

this.ObservableForProperty(m => m.PropertyOne).IgnoreValue()
.Merge(this.ObservableForProperty(m => m.PropertyTwo).IgnoreValue())
.Subscribe(..);
Другие вопросы по тегам