我试图将一堆函数调用链接到一个回调函数ptr(使用Action),并且每个函数调用都采用不同的参数(因此不能使用理想的委托,除非我遗漏了一些东西:) )所以这就是我做的:
for (int i=0; i<num_func_calls; ++i)
{
// could be anything different for each call
int call_id = i;
Action old_action = lastAction;
lastAction = new Action(() =>
{
FuncCall(call_id, true);
old_action();
});
}
它按照我的预期工作,但问题是:这是有效/正确吗?有什么问题需要我担心吗?
谢谢!
答案 0 :(得分:2)
以下是使用高阶函数的示例。
static Action Apply(IEnumerable<int> data)
{
Action zero = () => { };
return data.Aggregate(zero,
(a, id) => a + (() => FuncCall(id, true)));
}
答案 1 :(得分:0)
我不完全确定你问的是什么,但我只想在你的帖子中解决一些错误的事情。
首先; Action
是Delegate
,它只是一个接受单个参数而不返回值的参数。如果我有一些Action
调用它A
- Delegate d = A;
将编译并运行。
其次,要以一般方式传递args(意味着某些任意函数),您可以使用DynamicInvoke
并将参数包装在对象数组中。只要数组中的项具有正确的类型并且顺序正确,该方法就会正确执行。否则会抛出。
DynamicInvoke有一个特定的应用程序但作为一个例子,如果你向我提供Object[]
和Delegate
,我可以使用DynamicInvoke
来调用该函数而不知道它的定义是什么。等;
myDelegate.DynamicInvoke(args); // where args is an Object[]
通常,您只想在决定在运行时调用哪些代理时使用它。
答案 2 :(得分:0)
使用Task
这是一个很好的例子,因为它有.ContinueWith
,它告诉任务在完成时运行另一个任务。你可以把它们连在一起。
http://msdn.microsoft.com/en-us/library/dd270696.aspx
此外,您可以通过以下方式减少委托使用:
() => {
for (int i=0; i<num_func_calls; ++i) FuncCall(i, true);
}