Есть ли более элегантный способ объединения наблюдаемых, когда тип возвращаемого значения не важен?
У меня есть модель представления, похожая на 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(..);