如何为Reactive Extensions创建自定义扩展

时间:2015-02-22 00:52:14

标签: c# .net extension-methods system.reactive

找到how to make a custom LINQ extension method的例子并不难。但我找不到如何制作自定义Rx扩展方法的示例。

有人可以指向我的资源或发布示例吗?我使用的是最新的(版本2.2.5)。

我有兴趣制作定制" Cast"或定制"选择"。我可以反映现有扩展的源代码,但仍然不明显。

感谢。

1 个答案:

答案 0 :(得分:5)

在Rx中实现自定义扩展(除了编写现有操作之外)最常见的方法是通过Observable.Create。这样做是非常明智的,因为Create会解决一系列问题,因为实现这些问题并非易事。

不管你这样做,一定要摘要the Rx Design Guidelines来解释你应该遵循的规则和惯例 - 其中许多Observable.Create会照顾你。

以下是Cast实施示例:

public static class ObservableExtensions
{
    public static IObservable<TResult> Cast<TSource, TResult>(
        this IObservable<TSource> source)
    {
        return Observable.Create<TResult>(o =>
            source.Subscribe(x => {
                TResult cast;
                try
                {
                    cast = (TResult)(object)x;                        
                }
                catch (InvalidCastException ex)
                {
                    o.OnError(ex);
                    return;
                }
                o.OnNext(cast);
            },
            o.OnError,
            o.OnCompleted));
    }
}

我按原样放置它,因为双重转换要求并不明显(实际上IEnumerable的{​​{1}}执行相同的操作,原因相同)。鉴于需要Cast强制转换,您可以进行此调整以将类型参数减少为1:

object

您也可以在public static class ObservableExtensions { public static IObservable<TResult> Cast<TResult>( this IObservable<object> source) { return Observable.Create<TResult>(o => source.Subscribe(x => { TResult cast; try { cast = (TResult)x; } catch (InvalidCastException ex) { o.OnError(ex); return; } o.OnNext(cast); }, o.OnError, o.OnCompleted)); } } 上查看IntroToRx以了解更多内容。