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 オブジェクトのフィールド。

どちらのクラスも、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 を使っていたので、ある記述の型を変換できないというエラーが表示されていることは承知しています。なぜそれが私にそれを言っているのか理解できません.特に、コードが静的プログラムでは完全に機能しますが、クラスライブラリでは機能しません.

シャウティ

アップデート

考え直して、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; }
  }
}
4

2 に答える 2

1

コンパイラが Action の推論に問題があるようです...関連する拡張メソッドの using ステートメントが欠落している可能性があります。または、次のいずれかを試してください。

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

または:

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

Producer があるファイルにインクルードusing System;します。これは に変換するのに役立ちRespondToNewDataますIObserver<T>

于 2013-04-07T20:18:54.653 に答える