2016-05-14 83 views
1

我正在尝试从事件创建Observable序列。本次活动具有以下特征:从事件创建Observable时出错

event SensorValueChangedEventHandler SensorValueChanged; 

我想通过以下方式来创建可观察:

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

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

然而,编译器与下面的错误而失败

我想知道如果有人可以评论如何从这个事件正确创建观察。

+1

您的SensorValueChangedEventHandler的定义是什么? – Evk

+0

@Evk'''public delegate void SensorValueChangedEventHandler(object sender,SensorValueChangedEventArgs e);''' –

回答

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)和您委托映射。在第二和第三个参数中,您传递了订阅和取消订阅功能。

+0

这不会编译。 – Enigmativity

+0

@Enigmativity我已经编译并在发布之前使用nuget包中的最新Rx运行。 – Evk

+0

也许你的意思是我使用变量“p”而不是OP的CrossDeviceMotion.Current,但这并不重要。 – Evk

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)签名)类型的事件。

+1

这不是真的,FromEvent是“过时的”。当事件不符合标准.NET事件模式(发送者+事件参数)时使用它。在这种情况下,您确实可以使用FromEventPattern(或FromEvent) - 有些情况下您无法使用FromEventPattern。 – Evk

+0

@Evk - 对不起,这就是我说“观察事件”已经过时的意思。我的意思是标准的.NET事件模式。 – Enigmativity

+0

@Evk - 我希望你没有基于此投票。 – Enigmativity