您是否考虑过添加另一个Create方法:IObservable< TResult>创建< TResult>(表达式< Func< TResult>>表达式) [英] Have you been thinking about adding another Create method: IObservable<TResult> Create<TResult>(Expression<Func<TResult>> expression)

查看:95
本文介绍了您是否考虑过添加另一个Create方法:IObservable< TResult>创建< TResult>(表达式< Func< TResult>>表达式)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好我一直在研究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&lt; TResult&gt;创建&lt; TResult&gt;(表达式&lt; Func&lt; TResult&gt;&gt;表达式)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆