我正在试图弄清楚如何正确使用一个Action委托,它接受多个(通过十个)类型的参数,如下所示:
例如 Action<T,T,T>
。
假设我正在使用以下函数原型:
public void SomeFunc(Action<bool, int> foo)
在调用该函数时,如何将布尔值和整数值传递给foo?也许我只是把这整件事弄错了,但是当我在MSDN和其他来源上查找它时,我无法理解这件事实际上是如何工作的。与Func<TReturn, T, T>
对应的相同。
答案 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)
Action
和Func
代表就像其他代理一样工作。简单的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);});