0

我试图弄清楚如何正确使用带有多个(到十个)类型参数的 Action 委托,如下所示:

Action<T,T,T>例如。

假设我正在使用以下函数原型:

public void SomeFunc(Action<bool, int> foo)

调用该函数时,我将如何将布尔值和整数值传递给 foo ?也许我只是把整个事情弄错了,但是在 MSDN 和其他资源上查找它时,我无法理解这件事实际上是如何工作的。它的Func<TReturn, T, T>对应物也是如此。

MSDN 提出了一些非常难以理解的示例,我希望这里有人可以向我展示如何正确实现这些委托的示例。谢谢。

4

4 回答 4

4

您可以像这样使用lambda

SomeFunc( (a1, a2) => {
    Console.WriteLine(string.Format("params: {0}, {1}", a1, a2));
});

或者,如果您已经有一个与委托匹配的函数,您可以直接传递它。

void SomeFunc(Action<bool,int> foo)
{
    foo(true, 99);
    // stuff
}

void matchesDelegate(bool a1, int a2)
{
    Console.WriteLine(string.Format("params: {0}, {1}", a1, a2));
}

SomeFunc(matchesDelegate);

输出

参数:真,99

于 2012-08-31T01:14:04.433 回答
2

Action and Func delegates work just like any other. The simple Action delegate looks basically like:

public delegate void Action();

and is called like so:

public void doAction(Action foo)
{
    Action(); // You call the action here.
}

Using generic arguments, the definition basically looks like:

public delegate void Action(T1, T2, T3);

and is called like the following to pass parameters into the Action:

public void SomeFunc(Action<bool,int> foo)
{
    bool param1 = true;
    int param2 = 69;
    foo(param1, param2); // Here you are calling the foo delegate.
}

Just like other delegates, these delegates can be assigned with explicitly defined functions,

public void AnAction()
{
    Console.WriteLine("Hello World!");
}

doAction(AnAction);

or with anonymous functions.

Action<bool,int> anonymousAction = (b,i) =>
{
    if (b == true && i > 5)
        Console.WriteLine("Hello!");
    else
        Console.WriteLine("Goodbye!");
}
SomeFunc(anonymousAction);
于 2012-08-31T01:24:48.537 回答
2

带有如下签名:

public void SomeFunc(Action<bool, int> foo)

您只调用SomeFunc并传入一个参数 - 一个带有两个参数的操作。将操作视为回调方法,因为它实际上就是这样。在方法的某处,SomeFunc它将foo在那里调用并传递参数。您不需要自己提供它们。

于 2012-08-31T01:15:50.533 回答
1

如果 foo 是Action<bool, t>你可以调用它foo(true, 42)

如果你想调用 SomeFunc,你可以用一个方法来调用它:

SomeFunc(MyMethod);

你在哪里:

public void MyMethod(bool b, int i){}

或者您可以使用匿名方法调用它:

SomeFunc(delegate(bool b, int i) {Trace.WriteLine(b); Trace.WriteLine(i);});

或者您可以使用 lambda 调用它:

someFunc((b,i) => {Trace.WriteLine(b); Trace.WriteLine(i);});
于 2012-08-31T01:14:05.700 回答