首页 > 解决方案 > 使用嵌套泛型类型调用方法

问题描述

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

标签: c#genericscollections

解决方案


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

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

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

推荐阅读