gpt4 book ai didi

c# - 如何为响应式扩展制作自定义扩展

转载 作者:行者123 更新时间:2023-12-03 22:01:53 24 4
gpt4 key购买 nike

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

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

我有兴趣制作自定义“Cast”或自定义“Select”。我可以反射(reflect)现有扩展的源代码,但仍然不明显。

谢谢。

最佳答案

在 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));
}
}

我这样说是因为双重转换要求并不明显(实际上 IEnumerableCast 出于同样的原因做同样的事情)。您可以进行此调整以将类型参数减少为一个,前提是必须进行 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更多关于 Observable.Create 的信息。

关于c# - 如何为响应式扩展制作自定义扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28653253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com