您是否考虑过添加另一个Create方法:IObservable< TResult>创建< TResult>(表达式< Func< TResult>>表达式) [英] Have you been thinking about adding another Create method: IObservable<TResult> Create<TResult>(Expression<Func<TResult>> expression)
问题描述
您好我一直在研究Rx的一个扩展,它目前基于DataBinding,但我确信您可以删除此依赖项并保留API,我认为它非常好。您是否考虑过向Rx添加类似的功能?如果是这样,你为什么抛弃它?
Hi I've been working on one extension to Rx which is currently based on DataBinding but I'm sure you could remove this dependency and preserve API which I think it quite good. Have you been thinking about adding similar functionality to Rx? If so why you abandoned it?
您可以在以下网址获得有关我的解决方案的更多信息:
You can get more information about my solution at:
https://github.com / StanislawSwierc / CodeBinding
https://github.com/StanislawSwierc/CodeBinding
这是我为这个项目创建的API规范:
Here is the API Specification I created for this project:
以下示例创建IObservable的实例< int>当Value属性发生变化时会通知观察者。
// obj是一个实现INotifyPropertyChanged的实例
//带Value属性类型int
IObservable < INT 跨度>>
source = ObservableEx .Create(()=> obj.Value);
IObservable<int> source = ObservableEx.Create(() => obj.Value);
以下示例创建IObservable的实例< int>当表达式中使用的任何对象的Value属性发生更改时,它会通知观察者(obj1,obj2)。
// obj1和obj2是实现
的类的实例
// INotifyPropertyChanged,其Value属性类型为int
IObservable < int >
source = ObservableEx .Create(()=> obj1.Value + obj2.Value);
IObservable<int> source = ObservableEx.Create(() => obj1.Value + obj2.Value);
以下示例创建IObservable的实例< int>当obj对象上的Foo属性发生变化或obj.Foo对象上的Bar属性发生更改时,它会通知观察者。如果将obj.Foo更改为不同的实例,则检查
以查看它是否实现了INotifyPropertyChanged。如果是阳性测试,来自它的通知将触发表达式重新评估,并将传播给观察者。
如果是obj。 Foo为null且无法计算Bar属性,所有观察者都通过OnError方法通知NullReferenceException。此外,这会终止事件流。
// obj1是一个实现INotifyPropertyChanged的实例
// with Foo property另一种也实现此接口的类型
//属性栏类型为int
IObservable < int >
source = ObservableEx .Create(()=> obj.Foo.Bar);
IObservable<int> source = ObservableEx.Create(() => obj.Foo.Bar);
public
static class
ObservableEx
public static class ObservableEx
{
public static
IObservable < TResult> 创建< TResult>(表达式< Func < TResult>>表达式);
public static IObservable<TResult> Create<TResult>(Expression<Func<TResult>> expression);
< span lang ="EN-US"style ="font-size:9.5pt; font-family:Consolas">}
会员
公共
静态 IObservable < TResult>
public static IObservable<TResult>
创建< TResult>(表达式< Func < TResult>>
表达式);
Create<TResult>(Expression<Func<TResult>> expression);
行为
创建IObservable< T>提供的lambda表达式的对象。只要参与评估过程的任何属性发生变化,就会重新评估表达式。为了
检测这些瞬间,表达式中使用的对象必须实现INotifyPropertyChanged接口。
例外
ArgumentNullException– if expression为null
推荐答案
我们在Rxx中有类似的扩展名为
FromPropertyChangedPattern 。 它与 INotifyPropertyChanged ,
[Property]已更改事件模式以及WPF依赖项属性一起使用。 它还支持无限制的链接属性,例如
obj.Foo.Bar 示例。
We have a similar extension in Rxx called FromPropertyChangedPattern. It works with INotifyPropertyChanged, the [Property]Changed event pattern, and WPF dependency properties. It also supports unlimited chained properties like your obj.Foo.Bar example.
此扩展本身不直接支持复杂表达式,例如: ()=> obj1.Value + obj2.Value
This extension alone doesn't support complex expressions directly, such as: () => obj1.Value + obj2.Value
但是,我们在Rxx中有一个名为 OperationalObservables 的内容。 这些扩展程序可以提供与您的示例相同的功能:
However, we have something called OperationalObservables in Rxx. Together, these extensions can provide the same functionality as in your example:
var o1 = Observable2.FromPropertyChangedPattern(() => obj1.Value).AsOperational(Observable.CombineLatest);
var o2 = Observable2.FromPropertyChangedPattern(() => obj2.Value);
var o = o1 + o2;
这篇关于您是否考虑过添加另一个Create方法:IObservable< TResult>创建< TResult>(表达式< Func< TResult>>表达式)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!