【发布时间】:2018-03-17 13:41:26
【问题描述】:
我正在使用System.Func<T, T> 创建一个责任链管道,其中管道中的每个函数都包含对下一个函数的引用。
在构建管道时,我无法通过引用传递内部函数,因为它会由于重新分配管道函数而引发 StackOverflowException,例如:
Func<string, Func<string, string>, string> handler1 = (s, next) => {
s = s.ToUpper();
return next.Invoke(s);
};
Func<string, string> pipeline = s => s;
pipeline = s => handler1.Invoke(s, pipeline);
pipeline.Invoke("hello"); // StackOverFlowException
我可以通过闭包解决这个问题:
Func<string, Func<string, string>, string> handler1 = (s, next) => {
s = s.ToUpper();
return next.Invoke(s);
};
Func<Func<string, string>, Func<string, string>> closure =
next => s => handler1.Invoke(s, next);
Func<string, string> pipeline = s => s;
pipeline = closure.Invoke(pipeline);
pipeline.Invoke("hello");
但是,我想知道是否有更有效的方法来构建这个函数链,也许使用表达式?
【问题讨论】:
-
只是想知道,如果您知道问题是重新分配
pipeline(这是正确的),为什么不创建一个新变量? -
我的额外管道支持任意数量的函数。声明一个新变量并没有帮助,因为从根本上讲,您仍然必须通过引用传递以前的函数。
-
忽略上述,新变量是解决方案 - 我会责怪睡眠不足:)
-
很高兴为您提供帮助。你介意用你的解决方案发布你的答案吗?我更喜欢发布的 3 个答案中的一个
标签: c# chain-of-responsibility