【发布时间】:2018-07-17 14:10:40
【问题描述】:
我想开发一个通用管道。这意味着我调用一个元素,然后调用下一个元素,等等。就它而言,它按预期的方式工作。 现在我想开发一个抽象类(如果 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();
}
}
【问题讨论】:
-
这个约束
where TInput : List<TInput>没有多大意义。你是说TInput必须是List<TInput> -
是的,这正是我想说的。它必须是一个列表,否则该原则不起作用。列表中的每个项目都将使用 ProcessOne 方法进行处理。 (参见 Class
SomeImplementation)问题也会存在(我猜)因为那里也使用了泛型参数 TInput/TOutput,这是不正确的。
标签: c# generics collections