C#中的链接操作

时间:2013-08-07 22:32:02

标签: c# c#-4.0 delegates

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

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

谢谢!

3 个答案:

答案 0 :(得分:2)

以下是使用高阶函数的示例。

static Action Apply(IEnumerable<int> data)
{
    Action zero = () => { };
    return data.Aggregate(zero, 
        (a, id) => a + (() => FuncCall(id, true)));
}

答案 1 :(得分:0)

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

首先; ActionDelegate,它只是一个接受单个参数而不返回值的参数。如果我有一些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);
}