从Event创建Observable时出错

时间:2016-05-14 15:48:58

标签: c# system.reactive

我正在尝试从事件创建一个Observable序列。该活动具有以下签名:

event SensorValueChangedEventHandler SensorValueChanged;

我正在尝试以下列方式创建Observable:

var eventAsObservable = Observable.FromEvent(
                                (EventHandler<SensorValueChangedEventArgs> ev) => new SensorValueChangedEventHandler(ev), 
                                ev => CrossDeviceMotion.Current.SensorValueChanged += ev,
                                ev => CrossDeviceMotion.Current.SensorValueChanged -= ev);

但是,编译器失败并出现以下错误:

Error CS0029: Cannot implicitly convert type `System.Action' to `DeviceMotion.Plugin.Abstractions.SensorValueChangedEventHandler'

我想知道是否有人可以评论如何从此事件中正确创建一个observable。

2 个答案:

答案 0 :(得分:2)

你很可能需要这样做:

var eventAsObservable = Observable.FromEvent<SensorValueChangedEventHandler, SensorValueChangedEventArgs>(
    handler => (sender, args) => handler(args),
    ev => CrossDeviceMotion.Current.SensorValueChanged += ev,
    ev => CrossDeviceMotion.Current.SensorValueChanged -= ev);

在第一个参数中,您将告诉如何在Action<SensorValueChangedEventArgs>(基本上为OnNext)和您的代理之间进行映射。在第二个和第三个参数中,您传递了subscribe和unsubscribe函数。

答案 1 :(得分:1)

您似乎使用过时的方法来观察标准的.NET事件 - 它不再是FromEvent - 您应该使用FromEventPattern

代码应如下所示:

var eventAsObservable =
    Observable
        .FromEventPattern<SensorValueChangedEventHandler, SensorValueChangedEventArgs>(
                ev => CrossDeviceMotion.Current.SensorValueChanged += ev,
                ev => CrossDeviceMotion.Current.SensorValueChanged -= ev);

.FromEvent方法用于处理非标准(不符合(object sender, XxxEventArgs e)签名)类型的事件。