Subject.Subscribe只能在静态实例中工作(或者我错过了什么)

时间:2013-04-07 20:09:35

标签: visual-studio-2010 compiler-errors system.reactive

我正在讨论反应性延伸,而且我遇到了一个障碍,我不能在我的生活中弄清楚原因是什么。

如果我使用的是.NET 4控制台模式应用程序,其中所有内容都是静态的,如下所示:

using System;
using System.Reactive.Subjects;
using FakeDal;
using FakeDal.Entites;
using RxProducer;

namespace Runner
{
  class Program
  {
    private static readonly Subject<DaftFrog> _subject = new Subject<DaftFrog>();
    private static readonly Repository<DaftFrog> _frogRepo = new Repository<DaftFrog>();


    static void Main()
    {
      _subject.Subscribe(RespondToNewData);
    }

    private static void RespondToNewData(DaftFrog frog)
    {
      _frogRepo.Save(frog);
    }


  }
}

DaftFrog只是我假冒DAL类中的一个测试类,这是一个简单的.NET 4类库项目,DaftFrog类,是一个带有几个字段的简单poco,dal.save方法只是简单地控制台.DftFrog对象中字段的.WriteLine。

一旦我开始使RX代码工作,这两个类只是简单的替代品。

无论如何,回到问题,所以上面的代码工作正常,如果我做了一些

_subject.OnNext(new DaftFrog());

调用,假dal类,打印出我期望的东西,一切正常......

无论其&GT; ....

如果我按原样将代码传输到类库,然后在我的“静态程序”中新建该类库,如下所示:

using System.Reactive.Subjects;
using FakeDal;
using FakeDal.Entites;

namespace RxProducer
{
  public class Producer
  {
    private readonly Subject<DaftFrog> _subject = new Subject<DaftFrog>();
    private readonly Repository<DaftFrog> _frogRepo = new Repository<DaftFrog>();

    private int _clock;

    public void Start()
    {
      _subject.Subscribe(RespondToNewData);
    }

    public void Stop()
    {
    }

    public void Tick()
    {
      if(_clock % 5 == 0)
      {
        DaftFrog data = new DaftFrog();
        _subject.OnNext(data);
      }
      _clock++;

    }

    private void RespondToNewData(DaftFrog frog)
    {
      _frogRepo.Save(frog);
    }
  }
}

然后在我的程序中使用该类

using System;
using RxProducer;

namespace Runner
{
  class Program
  {
    private static readonly Producer _myProducer = new Producer();

    static void Main()
    {
      _myProducer.Start();

      while(!line.Contains("quit"))
      {
        _myProducer.Tick();
        line = Console.ReadLine();
      }

      _myProducer.Stop();
    }

  }
}

然后我的项目无法编译。

具体来说,它失败了:

_subject.Subscribe(RespondToNewData);

在RxProducer类库中,更重要的是,编译器抛出的错误也没有意义:

Error   1   The best overloaded method match for 'System.Reactive.Subjects.Subject<FakeDal.Entites.DaftFrog>.Subscribe(System.IObserver<FakeDal.Entites.DaftFrog>)' has some invalid arguments  H:\programming\rxtesting\RxProducer\Producer.cs 17  7   RxProducer

Error   2   Argument 1: cannot convert from 'method group' to 'System.IObserver<FakeDal.Entites.DaftFrog>'  H:\programming\rxtesting\RxProducer\Producer.cs 17  26  RxProducer

起初我认为它可能是静态的东西,所以我在类库中做了一切静态的,这根本没有任何区别。

到目前为止我对Rx做的并不多,但是我在99%的时间里使用C#和VS,所以我知道错误告诉我它无法转换某种描述,我只是不明白为什么它告诉我,特别是当代码在静态程序中完美运行时,而不是在类库中。

辣妹

更新

第二个想法,我只知道会有那些坚持我发布假蜻蜓和愚蠢青蛙定义的人,即使恕我直言他们也不会被要求,但是为了安抚那些会在这里问他们的成群的伪装者: - )

using System;

namespace FakeDal
{
  public class Repository<T>
  {
    public void Save(T entity)
    {
      Console.WriteLine("Here we write T to the database....");
    }

  }
}

namespace FakeDal.Entites
{
  public class DaftFrog
  {
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsTotalyDaft { get; set; }
  }
}

2 个答案:

答案 0 :(得分:1)

听起来编译器无法推断Action ... 可能缺少相关扩展方法的using语句。或者,尝试以下任一方式:

_subject.Subscribe ((Action<DaftFrog>) RespondToData);

或者:

var obs = Observer.Create ( I forget the overload );
_subject.Subscribe( obs);

答案 1 :(得分:1)

using System;包含在您拥有Producer的文件中,这有助于将RespondToNewData转换为IObserver<T>