Luis Delgado
Luis Delgado

Reputation: 3744

Error creating Observable from Event

I am trying to create an Observable sequence from an event. The event has the following signature:

event SensorValueChangedEventHandler SensorValueChanged;

I am trying to create the Observable in the following way:

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

However, the compiler is failing with the following error:

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

I am wondering if someone can comment on how to correctly create an observable from this event.

Upvotes: 1

Views: 270

Answers (2)

Evk
Evk

Reputation: 101613

Most likely you need to do it like this:

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

In the first argument you tell how to map between Action<SensorValueChangedEventArgs> (basically OnNext) and your delegate. In second and third arguments you pass subscribe and unsubscribe functions.

Upvotes: 2

Enigmativity
Enigmativity

Reputation: 117175

You appear to be using an obsolete method for observing standard .NET events - it's no longer FromEvent - you should be using FromEventPattern.

The code should look like this:

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

The .FromEvent method is used for handling non-standard (doesn't comply with (object sender, XxxEventArgs e) signature) type events.

Upvotes: 1

Related Questions