很容易找到一个示例如何制作自定义的LINQ扩展方法。但我找不到如何制作自定义Rx扩展方法的示例。
有人能指向一个资源或发布一个示例吗?我正在使用最新版本(ver 2.2.5)。
我有兴趣制作自定义的“Cast”或自定义的“Select”。我可以反射现有扩展的源代码,但仍然不清楚。
谢谢。
很容易找到一个示例如何制作自定义的LINQ扩展方法。但我找不到如何制作自定义Rx扩展方法的示例。
有人能指向一个资源或发布一个示例吗?我正在使用最新版本(ver 2.2.5)。
我有兴趣制作自定义的“Cast”或自定义的“Select”。我可以反射现有扩展的源代码,但仍然不清楚。
谢谢。
Observable.Create
。强烈建议使用这种方法,因为Create
会处理许多问题,如果你自己实现,则非常复杂。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
的 Cast
函数出于同样的原因也会执行相同的操作)。你可以通过进行以下微调来将类型参数减少到一个,前提是需要进行 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));
}
}
Observable.Create
的内容。通常可以通过组合现有的操作符来创建新的Rx操作符。例如,可以使用内置的Select
操作符实现Cast
操作符,如下所示:
public static IObservable<TResult> Cast<TSource, TResult>(
this IObservable<TSource> source)
{
return source.Select(x => (TResult)(object)x);
}
o.OnNext
不应该在try
块中。 - Dave SextonIDisposable
以直接从源中取消订阅源。 - James World