【问题标题】:IObservable<> missing .Subscribe extension methodsIObservable<> 缺少 .Subscribe 扩展方法
【发布时间】:2012-05-09 17:20:11
【问题描述】:

我正在使用 RX 扩展和 WF4 来创建一个工作流,该工作流对可观察到的消息做出反应以推进工作流。为此,我引入了一个包含 IObservable 的对象(ModuleMessage 是我的抽象类。)我遇到的问题是 .Subscribe 无法识别其任何扩展方法,即用于 lambda 扩展/方法组的扩展方法。在下面的代码中,我有引用:

using System.Activities;
using System.Activities.Hosting;
using System.Collections.Generic;
using System.Reactive.Linq;

还有下面这行代码:

    internal void AddModuleCallback(IModule module)
    {
        if (!addedCallback)
        {
            addedCallback = true;
            module.Messages.Where(m => m is MemberLeftModuleMessage || m is MemberRemovedModuleMessage).Subscribe(m => this.OnMemberExit(m)); // This line errors
        }
    }

    internal void OnMemberExit(ModuleMessage message)
    {
        // Gizmo was fired, resume the bookmark
        this.instance.BeginResumeBookmark(
            new Bookmark(ModuleVisit.BookmarkName),
            message is MemberLeftModuleMessage,
            r => this.instance.EndResumeBookmark(r),
            null);
    }

编译时错误:

Error   1   Cannot convert lambda expression to type 'System.IObserver<Components.Messages.ModuleMessage>' because it is not a delegate type    <Removed>\WaitForModuleVisitExtension.cs    34  119 Components

请注意,此代码改编自一个示例,并没有按照我的喜好进行分解,我只是关心手头的问题。我不是 RX 或 WF4 的专业人士,但在同一解决方案的其他地方以这种方式使用了订阅。我已经通过 NuGet 将 RX 添加到这个项目中。

编辑:如果我用作方法组(而不是 lambda),则会出现以下错误:

Error   2   Argument 1: cannot convert from 'method group' to 'System.IObserver<Components.Messages.ModuleMessage>' <removed>\WaitForModuleVisitExtension.cs    34  119 Components

【问题讨论】:

  • 您能分享您提到的示例的链接吗?这看起来很有趣。我一直认为 Observables 是不可序列化的,那么如何在需要随时支持持久性的工作流中使用它们呢?
  • 这是很久以前的事了,我都不记得了。我想我在被其他闪亮的东西分心之前从来没有达到过这一点(这是一个个人项目)

标签: workflow-foundation-4 system.reactive nuget


【解决方案1】:

你错过了这个:

using System;

这是包含 ObservableExtensions 静态类和所有 Subscribe 扩展方法的命名空间。

扩展方法是通过using 指令“发现”的(以及尝试使用它们的代码的命名空间层次结构)。

【讨论】:

  • 谢谢!这并不明显......我希望有一个更好的错误。我想这就是我们为扩展方法付出的代价=(我正在使用 ReSharper,通常它会为我捕获这些东西。它一定是另一个 .Subscribe 的存在阻止了发现。
  • 这是一个完全不明显的问题。订阅 IObserver 是 Visual Studio 将检测到的。所以扩展方法不会被拾取。
  • 不幸的是,这个问题似乎伤害了我们这些删除不需要的命名空间的人!太糟糕了...
  • 别忘了您还需要引用 System.Reactive.Core,以使扩展方法可被发现
  • @Sprague ctrl+alt+space,Resharper 将尝试解析所有引用程序集中的所有有效扩展方法,无论您是否已经在使用命名空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2011-10-07
相关资源
最近更新 更多