Action <t,t,t>如何工作?</t,t,t>

时间:2012-08-31 01:08:09

标签: c# abstraction

我正在试图弄清楚如何正确使用一个Action委托,它接受多个(通过十个)类型的参数,如下所示:

例如

Action<T,T,T>

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

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

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

MSDN提出了一些非常难以理解的例子,我希望这里的某个人能够真正向我展示这些代表如何正确实现的示例。感谢。

4 个答案:

答案 0 :(得分: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);

输出

  

params:true,99

答案 1 :(得分:2)

签名如下:

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

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

答案 2 :(得分:2)

ActionFunc代表就像其他代理一样工作。简单的Action委托基本上看起来像:

public delegate void Action();

并且如此调用:

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

使用泛型参数,定义基本上如下:

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

并按以下方式调用以将参数传递给Action:

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

与其他代理一样,可以为这些代理分配明确定义的函数,

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

doAction(AnAction);

或使用匿名函数。

Action<bool,int> anonymousAction = (b,i) =>
{
    if (b == true && i > 5)
        Console.WriteLine("Hello!");
    else
        Console.WriteLine("Goodbye!");
}
SomeFunc(anonymousAction);

答案 3 :(得分: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);});