我有一个接受Action
委托并执行给定方法的方法,如下所示:
public void ExpMethod(Action inputDel)
{
inpuDel();
}
我可以这样调用上面给出的方法:
ExpMethod(() => {/*do something that matters*/});
一切正常。到现在为止还挺好。现在我想要一个将通用Action
委托作为输入参数的方法 - 像这样:
public void ExpGenMethod(Action<string,int> inputDel)
{
// I don't know how to call the supplied delegate as it requires parameters
}
另外,我试图以这种方式调用此ExpGenMethod
:
ExpGenMethod(("Hi",1) => {/*do something that makes sense*/});
但它显示语法错误。在这种情况下,请告诉我如何使用通用操作委托?
答案 0 :(得分:6)
委托的关键是要有一个指向方法的指针。在声明它的同时将参数传递给它是没有意义的。而是在{em>执行委托的方法中传递您的委托的参数,在ExpGenMethod
的情况下:
你应该这样做:
public void ExpGenMethod(Action<string,int> inputDel)
{
inputDel("Hi", 1);
}
并称之为:
ExpGenMethod((x, y) => {/*do something that makes sense*/});
执行该委托时,x
评估为"Hi"
,y
评估为1
。
答案 1 :(得分:2)
(a,b) => {/*do something that matters*/}
表示a和b是在调用期间指定的参数。在这里你使用常量,所以你应该做() => { use "Hi"; use 1;}
这样的事情,这会让你回到你的第一个工作实例。
如果你想传递参数,你可以这样做:
public void work()
{
ExpGenMethod((a) => {/*do something that matters*/});
}
public void ExpGenMethod(Action<int> inputDel, int parameterToUse)
{
inputDel(parameterToUse);
}
答案 2 :(得分:0)
通常,您会希望在 ExpGenMethod中进行繁重的工作,而在委托本身中,您只是将参数传递给ExpGenMethod。
using System;
public class Program
{
public static void Main()
{
ExpGenMethod((options) =>
{
options.x = "Hi";
options.y = 1;
});
}
public static void ExpGenMethod(Action<Options> inputDel)
{
var options = new Options();
inputDel(options);
/* have access to x and y so do some thing useful with these values */
Console.WriteLine(options.x);
Console.WriteLine(options.y);
}
}
public class Options
{
public string x { set; get;}
public int y { set; get; }
}
答案 3 :(得分:0)
接着@HimBromBeere 的解释:
关键字 Action 定义为委托:
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
所以如果方法定义为:
public void ExpGenMethod(Action<string,int> inputDel)
{
inputDel("Hi", 1);
}
您可以使用 Lambda 表达式调用带有参数 x,y 的 ExpGenMethod,并使用 Console.Writeline 查看结果,如下所示:
ExpGenMethod((x, y) => { Console.WriteLine($"{x} {y}"); });