c# - 使用嵌套泛型类型调用方法
问题描述
我想开发一个通用管道。这意味着我调用一个元素,然后调用下一个元素,等等。就它而言,它按预期的方式工作。现在我想开发一个抽象类(如果 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
实现了andPipieItem
的集合: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();
}
}
推荐阅读
- python-3.x - 美化 argparse 字符串
- laravel - 我正在尝试使用 laravel 8 显示特定名称的计数
- c# - C# VSIX 定期将状态消息写入输出窗口
- android - Android 在 Android 手机 LockScreen 上显示活动
- heroku - 付款验证
- node.js - 错误:ENOENT:没有这样的文件或目录,stat 'C:\Users\username\Documents\My Music'
- haskell - 无法将预期类型“请求”与实际类型“[Char]”匹配
- zkemkeeper - System.Runtime.InteropServices.COMException: '服务器抛出异常。(来自 HRESULT 的异常:0x80010105 (RPC_E_SERVERFAULT))'
- c# - 如何使用自定义登录服务器对 asp.net Web 应用程序进行身份验证?
- c# - Blazor - 如何在浏览器中保存布尔状态(真/假),使其在重新加载页面时不会改变?