Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用泛型和合成的链接方法_C#_Generics - Fatal编程技术网

C# 使用泛型和合成的链接方法

C# 使用泛型和合成的链接方法,c#,generics,C#,Generics,我试图对一系列“阶段”C#进行建模,其中每个阶段都有一个输入和输出,它们可以链接在一起,阶段1的输出成为阶段2的输入。我想它可能看起来像这样,但我不知道用什么来代替 public class Phase<TInput, TOutput> { private Phase<???, TInput> prerequisite; public Phase(Phase<???, TInput> prereq, Func<TInput, TOutput&g

我试图对一系列“阶段”C#进行建模,其中每个阶段都有一个输入和输出,它们可以链接在一起,阶段1的输出成为阶段2的输入。我想它可能看起来像这样,但我不知道用什么来代替

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

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

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

您可以尝试使用两个类:

public class OutputOfPhase<TOutput>
{
}

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

      public Phase(OutputOfPhase<TInput> prereq, Func<TInput, TOutput> work)
      {
      /* ... */
      }
}
公共类OutputOfPhase
{
}
公共类阶段:OutputOfPhase
{
专用输出相位先决条件;
公共相位(输出相位预请求,功能工作)
{
/* ... */
}
}
你可以这样使用它:

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 p1=新阶段(null,p=>p*1000L);
阶段p2=新阶段(p1,p=>p/2.0);

阶段
类派生自只包含类的输出部分的基类。您可以将一个类的输出传递给下一个类,而下一个类不需要知道上一个对象的输入。

您的标题中不需要标记,标记系统可以工作。你应该给你的问题一个更具描述性的标题,这样人们可以看到它是关于什么的,而不是一个非常宽泛的描述。标题中标签的使用在上进行了讨论。听起来你可能在试图重新发明monads(或者comonads)。我的C#monads系列文章可能会对没有函数式编程背景的初学者有所帮助。
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);