1

我正在尝试将一堆函数调用链接到一个回调函数 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();
    });
}

它按我的预期工作,但问题是:这有效/正确吗?有什么问题或我需要担心的事情吗?

谢谢!

4

3 回答 3

2

这是一个使用高阶函数的示例。

static Action Apply(IEnumerable<int> data)
{
    Action zero = () => { };
    return data.Aggregate(zero, 
        (a, id) => a + (() => FuncCall(id, true)));
}
于 2013-08-07T23:06:01.807 回答
0

我不完全确定你在问什么,但我只是要解决你帖子中一些错误的事情。

首先; Action是一个Delegate它只是一个接受单个参数并且不返回值的参数。如果我有一些Action调用它A-Delegate d = A;将编译并运行。

其次,要以一般方式(意味着某些任意函数)传递参数,您可以使用DynamicInvoke并将参数包装在对象数组中。只要数组中的项目类型正确且顺序正确,该方法就会正确执行。否则会抛出。

DynamicInvoke 有一个特定的应用程序,但作为示例,如果您向我提供 anObject[]和 a,Delegate我可以使用它DynamicInvoke来调用该函数,而无需知道它的定义是什么。喜欢;

  myDelegate.DynamicInvoke(args); // where args is an Object[]

通常,您只想在决定在运行时调用哪些委托时使用它。

于 2013-08-07T22:39:53.800 回答
0

这将是使用 a 的好例子Task,因为它.ContinueWith告诉任务在完成时运行另一个任务。您可以将它们链接在一起。

http://msdn.microsoft.com/en-us/library/dd270696.aspx

此外,您可以通过执行以下操作来减少委托使用:

() => {
    for (int i=0; i<num_func_calls; ++i) FuncCall(i, true);
}
于 2013-08-07T23:02:15.533 回答