0

我正在处理响应式扩展,我遇到了一个我无法为我的生活找出原因的障碍。

如果我使用 .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 方法只是简单地做了一个 console.WriteLine DaftFrog 对象中的一个字段。

一旦我开始让 RX 代码工作,这两个类都只是真实事物的简单替代品。

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

_subject.OnNext(new DaftFrog());

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

然而>....

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

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,所以我知道错误告诉我它不能转换某种描述的类型,我只是不'不明白为什么它告诉我,尤其是当代码在静态程序中完美运行时,但在类库中却没有。

肖蒂

更新

Second thoughts, I just know there are going to be those who insist that I post the fakedal and daft frog definitions, even though IMHO they won't be required, but to pacify the hordes of pretenders who will ask here they are :-)

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; }
  }
}
4

2 回答 2

1

Sounds like the compiler is having trouble inferring the Action...might be missing a using statement for the relevant extension method. Alternatively, try either of:

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

Or:

var obs = Observer.Create ( I forget the overload );
_subject.Subscribe( obs);
于 2013-04-07T20:15:19.367 回答
1

Include using System; into file where you have Producer, this will help to convert RespondToNewData to IObserver<T>.

于 2013-04-07T20:18:54.653 回答