C# 将一个方法作为参数传递给另一个方法

C# 将一个方法作为参数传递给另一个方法,c#,.net,winforms,methods,delegates,C#,.net,Winforms,Methods,Delegates,我有一个名为LoadData的方法,它从数据库获取数据并填充DataGridView 我使用秒表测量我的方法完成其工作所需的时间,如下所示: private void btnLoadData_Click(object sender, EventArgs e) { var sw = new System.Diagnostics.Stopwatch(); sw.Start(); LoadData (); sw.Stop(); ShowTakenTime(sw.

我有一个名为LoadData的方法,它从数据库获取数据并填充
DataGridView

我使用秒表测量我的方法完成其工作所需的时间,如下所示:

private void btnLoadData_Click(object sender, EventArgs e)
{
    var sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    LoadData ();
    sw.Stop();
    ShowTakenTime(sw.ElapsedMilliseconds);
}
我想要的东西可以做到以下几点:

private void MeasureTime(Method m)
{
    var sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    m.Invoke();
    sw.Stop();
    ShowTakenTime(sw.ElapsedMilliseconds);
}
这样我就可以将LoadData方法传递给它,它会为我完成其余的工作

MeasureTime(LoadData());

如何执行此操作?

对于没有参数且返回void的方法,可以使用:

如果您有一些参数或返回类型,请使用

私有无效度量时间(System.Action a)
{
var sw=新系统.Diagnostics.Stopwatch();
sw.Start();
a();
sw.Stop();
ShowTakenTime(软件延时百万秒);
}

您可以使用操作,因为您没有返回任何内容:


如果要将参数传递给方法
m
,请使用操作,例如,如果要将int和字符串传递给方法,请使用
Action

private void MeasureTime(动作m)
{
var sw=新系统.Diagnostics.Stopwatch();
sw.Start();
m(42,“你好世界”);
sw.Stop();
ShowTakenTime(软件延时百万秒);
}
如果需要访问方法的返回值,请使用Func:

private void度量时间(Func m)
{
var sw=新系统.Diagnostics.Stopwatch();
sw.Start();
var结果=m(42,“你好世界”);
sw.Stop();
ShowTakenTime(软件延时百万秒);
}

在类中定义一个具有所需签名的委托:

delegate int YourDelegate(string s);
获取委托并运行它的方法

void CallerMethod(YourDelegate method)
{
    int result = method("");
}
方法将要通过,并且与
您的委托
兼容:

int MethodToPass(string s)
{
    throw new exception();
}
MethodToPass
传递给
callerMethod

CallerMethod(MethodToPass);

另外,您可以使用预定义的
Func
通用委托来代替声明新委托,该委托支持任何类型的输入和输出

谢谢,如果我有参数该怎么办?最后一个问题是,如果我的Func没有参数,但我希望它返回int怎么办?在这种情况下,只需使用Func m=()=>{return 42;};此答案中的
MeasureTime
方法采取
操作
,因为它不在乎。您可以在lambda中包装与
操作
匹配的任何方法,如本例所示:
MeasureTime(()=>{localResult=MethodWithArgsAndRet(localArg1,localArg2,localArg3);})。名为“local”的变量仅由匿名函数(lambda)捕获。
delegate int YourDelegate(string s);
void CallerMethod(YourDelegate method)
{
    int result = method("");
}
int MethodToPass(string s)
{
    throw new exception();
}
CallerMethod(MethodToPass);