C# 将一个方法作为参数传递给另一个方法
我有一个名为LoadData的方法,它从数据库获取数据并填充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.
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);