Rx Wiki 的 101 Rx Samples 中有一些样本实际上不再有效。我认为这是因为我有最新的 Rx 版本 (1.0.10621.2),但我想确认并看看如何让它们工作。
例如,下面的示例代码不起作用:
class ObserveEvent_Generic
{
public class SomeEventArgs : EventArgs { }
public static event EventHandler<SomeEventArgs> GenericEvent;
static void Main()
{
// To consume GenericEvent as an IObservable:
IObservable<IEvent<SomeEventArgs>> eventAsObservable = Observable.FromEvent<SomeEventArgs>(
ev => GenericEvent += ev,
ev => GenericEvent -= ev);
}
}
缺少 IEvent,“ev => GenericEvent += ev”导致“无法将类型 System.Action<xxx>
隐式转换为 System.EventHandler<xxx>
错误。
最佳答案
在这种情况下,您有几种选择。第一个是提供一个与标准 EventHandler 模式匹配的委托(delegate)(生成的 Observable 的类型为 IObservable<SomeEventArgs>
)。请注意我提供的 lamda 接受“o
”(“发件人”),但未使用此参数:
IObservable<SomeEventArgs> eventAsObservable =
Observable.FromEvent<SomeEventArgs>
(
ev => GenericEvent += (o,e) => ev(e),
ev => GenericEvent -= (o,e) => ev(e)
);
特别是在您的情况下(静态事件...哎呀!),我不愿相信取消订阅会真正正确地清理,并且您可能会根据使用情况最终导致严重的内存泄漏。或者,您可以指定委托(delegate)类型。注意这里额外的通用参数 FromEvent
IObservable<SomeEventArgs> eventAsObservable =
Observable.FromEvent<EventHandler<SomeEventArgs>, SomeEventArgs>
(
ev => GenericEvent += ev,
ev => GenericEvent -= ev
);
将源/发送者对象的处理移至 Observer(使类型为 IObservable<EventPattern<SomeEventArgs>>
的可观察对象)的另一种选择是使用 FromEventPattern
方法。我在某些构建中使用此方法遇到了一些麻烦,因此您的里程可能会有所不同,但这是替代方案:
IObservable<EventPattern<SomeEventArgs>> eventAsObservable =
Observable.FromEventPattern<SomeEventArgs>
(
ev => GenericEvent += ev,
ev => GenericEvent -= ev
);
希望这对您有所帮助。
关于observablecollection - 重大更改破坏了 Rx 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8751903/