我正在尝试在 C# 中完成以下任务。然而,为简洁起见,我使用函数式/Haskell 风格的伪代码来表达我的观点。
想象一个exec
接受任意数量参数的函数。每个参数都是一个不带参数的委托,并产生一些结果:() => T
. exec
执行所有提供的函数并以倍数返回它们的结果。
var results = exec(func1, func2, ..., funcN);
//results will be (res1, res2, ..., resN)
如果我想用 处理结果process
,我如何确保它不会在运行时失败,因为 my 的输入类型process
和结果倍数之间存在一些不匹配?
var process = results@(_, res2, ..., _) => res2;
//this must be typesafe, IFF this compiles:
var finalResult = process(results);
我怎样才能做到这一点?
一些额外的想法:
我可以想象泛型可能会有所帮助,但我不确定如何。以下面的代码为例:
var results = exec<T:ArgToResultTuple>(func1, func2, ...) // OR
var results = exec<T:ArgToResultTuple>(func[]{func1, func2, ...})
这种方法可能比普通重载更具可扩展性,因为ArgToResultTuple
如果我想容纳不同数量的参数/结果,我只需要创建一个新的子类。
另一种方法是构建一个类似功能列表的结构,但这对最终用户来说很不方便:
var results = exec(func1, exec(func2, func3));
var process = results@(_, (res2, _)) => res2
//will this be typesafe?:
var finalResult = process(results);