我正在讨论反应性延伸,而且我遇到了一个障碍,我不能在我的生活中弄清楚原因是什么。
如果我使用的是.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; }
}
}
答案 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>
。