Я возился с реактивными расширениями, и я столкнулся с проблемой, из-за которой я не могу понять, в чем причина.
Если я использую приложение режима консоли .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 of поле в объекте 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 до сих пор, но я работаю с C # и VS 99% времени, поэтому я знаю, что ошибка говорит мне, что он не может преобразовать тип некоторого описания, я просто не не понимаю, почему мне это говорят, особенно когда код отлично работает в статической программе, но не в библиотеке классов.
Шоути
ОБНОВИТЬ
Во-вторых, я просто знаю, что будут те, кто будет настаивать на том, чтобы я разместил определения fakedal и daft frog, хотя ИМХО они не потребуются, но чтобы усмирить полчища претендентов, которые будут спрашивать, вот они :-)
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; }
}
}