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

时间:2018-07-17 14:10:41

标签: c# generics collections

我想开发一个通用管道。这意味着我先调用一个元素,然后再调用下一个元素,依此类推。就它而言,它按预期的方式工作。 现在,我想开发一个Abstract类(如果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();
    }
}

1 个答案:

答案 0 :(得分:0)

我不确定这是否是您想要的,但它至少应该为您提供一些指导。

您可以说TInput实现了TOutput集合中的CollectionPipe,而不是说PipieItem / TInput本身就是集合和TOutput

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();
    }
}