使用嵌套泛型类型调用方法



我想开发一个通用管道。这意味着我调用一个元素,然后调用下一个,等等。就它而言,它按照它应该的方式工作。现在我想开发一个抽象类,它(如果Tinput/TOutput是一个列表(通过抽象方法ProcessOne处理元素。我知道一定有一些东西和泛型类型有关。不幸的是,C#不喜欢它。我做错了什么?也许还有更好的方法可以做到这一点(请随意提供不同的方法(。

public interface IPipeline<out TOutput>
{
TOutput Process();
}
public abstract class PipeItem<TInput, TOutput> : IPipeline<TOutput>
{
protected readonly IPipeline<TInput> nextPipeItem;
protected PipeItem(IPipeline<TInput> nextPipeItem)
{
this.nextPipeItem = nextPipeItem;
}
public abstract TOutput Process();
}
public abstract class CollectionPipe<TInput, TOutput> : PipeItem<TInput, TOutput> 
where TInput : List<TInput>
where TOutput : List<TOutput>
{
protected CollectionPipe(IPipeline<TInput> nextPipeItem) : base(nextPipeItem)
{
}
public override TOutput Process()
{
return nextPipeItem.Process().Select(ProcessOne).ToList();
}
protected abstract TOutput ProcessOne(TInput input);
}
public class SomeImplementation : CollectionPipe<List<string> , List<char[]>> {
public SomeImplementation() : base(new SomeNextPipe())
{
}
protected override char[] ProcessOne(string input){
return input.ToCharArray();
}
}

我不完全确定这是否是您想要的,但它至少应该给您一些指导。

与其说TInput/TOutput必须是它们自己的集合,不如说CollectionPipe实现了TInputTOutput的集合的PipieItem

public abstract class CollectionPipe<TInput, TOutput> : PipeItem<List<TInput>, List<TOutput>>
{
protected CollectionPipe(IPipeline<List<TInput>> nextPipeItem) : base(nextPipeItem)
{
}
public override List<TOutput> Process()
{
return nextPipeItem.Process().Select(ProcessOne).ToList();
}
protected abstract TOutput ProcessOne(TInput input);
}

然后,实现可以只说它们输入和输出的类型,众所周知,它们是集合(因为它们实现CollectionPipe而不仅仅是PipeItem:

public class SomeImplementation : CollectionPipe<string, char[]>
{
public SomeImplementation() : base(/*something here*/)
{
}
protected override char[] ProcessOne(string input)
{
return input.ToCharArray();
}
}

最新更新