C# .NET Rx - System.Reactive在哪里?

34

我有丰富的Java背景,所以如果我在C#中忽略了一些显而易见的东西,请原谅我,但是我的研究却毫无进展。我正在尝试使用反应式Rx .NET库。编译器对 IObservable 没有抱怨,但对于调用 zip 方法则有。它会抛出“……是否缺少 using 指令或程序集引用?”。

我一直在查找命名空间,但找不到所需的内容。我也找不到 System.Reactive,如果使用它也会报错,而且所有的引用都已经包含在这个Windows 8.1应用程序中了。请问有人可以给我指点一下出了什么问题吗?

public sealed class EventEngine
{    
    private static readonly EventEngine singleton = new EventEngine();

    public static EventEngine get()
    {
        return singleton;
    }

    public IObservable<MusicNote> CurrentKey { get; set; }
    public IObservable<Scale> CurrentScale { get; set; }

    public IObservable<AppliedScale> CurrentAppliedScale
    {
        get
        {
            return CurrentScale.zip(CurrentKey,
                (s, k) => AppliedScale.getAppliedScale(k, s));
        } 
    }

    private EventEngine() {}
}

*更新*

在考虑了答案的反馈后,这是可行的版本。

public sealed class EventEngine
{
    private static readonly EventEngine singleton = new EventEngine();

    public static EventEngine get()
    {
        return singleton;
    }

    public IObservable<MusicNote> CurrentKey { get; set; }
    public IObservable<Scale> CurrentScale { get; set; }

    public IObservable<AppliedScale> CurrentAppliedScale
    {
        get
        {
            return Observable.Zip(CurrentScale, CurrentKey,
                (s, k) => AppliedScale.getAppliedScale(s,k));
        } 
    }

    private EventEngine() {}
}

你能展示一下你的 Scale 类吗? - David Tansey
2个回答

44

你可能没有将Rx所需的程序集引用添加到你的项目中。(引用一个程序集并不等同于导入命名空间! 你已经知道命名空间是什么了;程序集类似于JAR文件,是代码部署/分发的最小单位。在其内部定义的命名空间变得可用之前,你的项目必须引用它。)

编译器可能不会对IObservable<T>IObserver<T>抱怨,因为你的项目定位于.NET Framework 4或更高版本。自从.NET版本4起,这两个接口已成为核心.NET Framework类库(FCL)的一部分。(如果你针对较早的.NET版本,则使用这些未定义的接口将出现错误。)

Rx的每个部分都不包括这两个接口以外的内容,并且驻留在它们自己的(附加)程序集中。 你可以通过安装相应的NuGet软件包将它们添加到你的项目中:

  1. 在Visual Studio中,转到工具NuGet软件包管理器软件包管理器控制台

  2. 在NuGet控制台窗口中,在下拉列表默认项目中选择目标项目(你想要使用Rx的地方)。

  3. 接下来,输入Install-Package System.Reactive并按Enter ↵键。(注意:此软件包先前称为Rx-Main; 有关详细信息,请参见此答案。)

  4. 这将向你的项目添加System.Reactive.*程序集引用。


3
因为 IObservable 存在,我曾经认为响应式库是 .NET 核心框架的固有部分,但事实上并非如此。 - tmn
7
在GitHub和MSDN上发布的关于RX.NET的信息非常混乱。作为一个新手,我甚至不知道有谁能够耐心地入门学习它...... MSDN表示其核心已包含(显然是指IObservable等),并没有提到其他内容。事实上,如果你尝试安装它,他们会把你带到一个超链接循环中(却没有任何实际下载):https://msdn.microsoft.com/en-us/library/hh242980(v=vs.103).aspx - Adam Plocher
@AdamPlocher 是的,那正是我的经历。 - John Zabroski
Reactive本身的文档/指南非常干净和详尽,但这可能是我遇到的最麻烦的“Hello World” ^_^;; - The Most Curious Thing

33
自版本3起,Rx项目现已更名为System.Reactive,因为它“使NuGet包命名符合NuGet指南,并且每个包中的主要命名空间也是如此。” 您可以通过在NuGet中搜索“System.Reactive”来下载它,或者您可以从这里下载:https://www.nuget.org/packages/System.Reactive/。这是该项目的GitHub页面: https://github.com/Reactive-Extensions/Rx.NET

软件包映射

  • Rx-Main System.Reactive
  • Rx-Core System.Reactive.Core
  • Rx-Interfaces System.Reactive.Interfaces
  • Rx-Linq System.Reactive.Linq
  • Rx-PlatformServices System.Reactive.PlatformServices
  • Rx-Testing Microsoft.Reactive.Testing

来源


4
如果您需要为.NET Framework v4.0安装它,该怎么办? - Michal Ciechan
1
@MichalCiechan 你可以获取这个版本。它适用于所有框架(>= 3.1.1)。 - Rogerson Nazário
这是所有.NET库中最浪费时间的库。我只想获取一个缓冲区扩展方法,所以我在Google上搜索“system observable buffer”,第三个链接是https://learn.microsoft.com/en-us/previous-versions/dotnet/reactive-extensions/hh212130(v=vs.103),但当我去下载Nuget包时它实际上并不存在。然后我发现了这个StackOverflow帖子,嘲笑着我对包映射的复杂性感到困惑。而且Visual Studio不会自动建议任何AsObservable()。 - John Zabroski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接