使用泛型和组合的链接方法

时间:2013-08-03 15:01:32

标签: c# generics

我正在尝试模拟一系列“阶段”C#,其中每个阶段都有输入和输出,并且它们可以链接在一起,第1阶段的输出成为阶段2的输入。我认为它可能看起来像这样,但我不知道用什么代替???。

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... */
  });

使用泛型有什么好的类型安全方法吗?或者有没有人有我应该考虑的设计方案?我可以想象使用反射来进行链接,或仅使用对象作为输入和输出,但我希望有更好的方法。

1 个答案:

答案 0 :(得分:3)

您可以尝试使用两个类:

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类派生自仅包含类的输出部分的基类。您可以将类的输出传递给下一个类,而下一个类不需要知道前一个对象的输入。