【问题标题】:Error creating Observable from Event从 Event 创建 Observable 时出错
【发布时间】:2016-05-15 23:38:53
【问题描述】:

我正在尝试从一个事件创建一个 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。

【问题讨论】:

  • 你的 SensorValueChangedEventHandler 的定义是什么?
  • @Evk public delegate void SensorValueChangedEventHandler (object sender, SensorValueChangedEventArgs e);

标签: c# system.reactive


【解决方案1】:

您很可能需要这样做:

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

在第一个参数中,您说明如何在 Action&lt;SensorValueChangedEventArgs&gt;(基本上是 OnNext)和您的委托之间进行映射。在第二个和第三个参数中传递订阅和取消订阅函数。

【讨论】:

  • 这不会编译。
  • @Enigmativity 在发布之前我已经编译并运行了它,使用的是 nuget 包中的最新 Rx。
  • 也许你的意思是我使用变量“p”而不是 OP 的 CrossDeviceMotion.Current,但这并不重要。
  • 我可以建议你使用handler =&gt; (sender, args) =&gt; handler(args)作为第一个参数吗?这比声明一个处理程序并返回它要简单得多。
【解决方案2】:

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

代码应如下所示:

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

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

【讨论】:

  • FromEvent 是“过时的”这不是真的。它在事件不符合标准 .NET 事件模式(发送者 + 事件参数)时使用。虽然在这种情况下您确实可以使用 FromEventPattern(或 FromEvent) - 在某些情况下您不能使用 FromEventPattern。
  • @Evk - 抱歉,这就是我所说的“观察事件”已过时的意思。我的意思是标准的 .NET 事件模式。
  • 您能否在回答中澄清这一点,以便我撤回投票?
  • @Evk:我认为我正在处理的事件的定义并没有与 EventPattern 可观察构造函数确认。这是不正确的吗?如果是,你会如何使用 EventPattern 来创建这个 observabler?
  • @LuisDelgado 你的事件是 (object sender, SomeEventArgs e) 所以它确实符合事件的标准 .NET 模式。您可以使用此答案中提供的代码。请注意,您的 observable 不是纯 SensorValueChangedEventArgs,而是 EventPattern 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2011-01-26
  • 1970-01-01
相关资源
最近更新 更多