1

各フェーズに入力と出力があり、フェーズ 1 の出力がフェーズ 2 の入力になるように連鎖できる一連の「フェーズ」C# をモデル化しようとしています。これですが、???の代わりに何を使用すればよいかわかりませんでした。

public class Phase<TInput, TOutput>
{
  private Phase<???, TInput> prerequisite;

  public Phase(Phase<???, TInput> prereq, Func<TInput, TOutput> work)
  {
    /* ... */
  }
}

私が最終的にやろうとしているのは、次のような一連のステップを連鎖させることです (「追加」メソッドは、フェーズを作成するのに役立つ便利なメソッドです)。

var p1 = AddInitialPhase(() => 
  {
    int a = /* some initial result */;
    return a;
  });

var p2 = AddPhase(p1, (result) =>    
  {
    string b = /* do something with result from p1 */
    return b;
  });

var p3 = AddPhase(p2, (result) =>    
  {
    /* etc... */
  });

ジェネリックでこれを行うためのタイプセーフな方法はありますか? または、私が検討すべき設計の代替案を誰かが持っていますか? リフレクションを使用してチェーニングを行うことや、オブジェクトを入力と出力に使用することは想像できますが、もっと良い方法があることを願っていました。

4

1 に答える 1

3

次の 2 つのクラスで試すことができます。

public class OutputOfPhase<TOutput>
{
}

public class Phase<TInput, TOutput> : OutputOfPhase<TOutput>
{
      private OutputOfPhase<TInput> prerequisite;

      public Phase(OutputOfPhase<TInput> prereq, Func<TInput, TOutput> work)
      {
      /* ... */
      }
}

次のように使用します。

Phase<int, long> p1 = new Phase<int, long>(null, p => p * 1000L);
Phase<long, double> p2 = new Phase<long, double>(p1, p => p / 2.0);

クラスは、クラスのPhase出力部分のみを含む基本クラスから派生します。次のクラスが前のオブジェクトの入力を知る必要なく、クラスの出力を次のクラスに渡すことができます。

于 2013-08-03T15:10:52.373 に答える