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

时间:2014-01-31 14:21:11

标签: c# .net winforms methods delegates

我有一个名为LoadData的方法,它从DataBase获取数据并填充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());

我该怎么做?

5 个答案:

答案 0 :(得分:2)

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

    private void MeasureTime(Action m)
    {
        var sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        m();
        sw.Stop();
        ShowTakenTime(sw.ElapsedMilliseconds);
    }

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

答案 1 :(得分:1)

如果要将参数传递给方法m,请使用操作&lt; ...&gt;,例如,如果要将int和字符串传递给Method,请使用Action<int,string>

private void MeasureTime(Action<int, string> m)
{
   var sw = new System.Diagnostics.Stopwatch();
   sw.Start();
   m(42, "Hello World");
   sw.Stop();
   ShowTakenTime(sw.ElapsedMilliseconds);
}

如果您需要访问Method的返回值,请使用Func&lt; ...&gt;:

private void MeasureTime(Func<int, string, string> m)
{
   var sw = new System.Diagnostics.Stopwatch();
   sw.Start();
   var result = m(42, "Hello World");
   sw.Stop();
   ShowTakenTime(sw.ElapsedMilliseconds);
}

答案 2 :(得分:0)

使用代理

private void MeasureTime(System.Action a)
{
    var sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    a();
    sw.Stop();
    ShowTakenTime(sw.ElapsedMilliseconds);
}

答案 3 :(得分:0)

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

http://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx

 MeasureTime(Action action)
 Action act = LoadData;
 act.Invoke();

答案 4 :(得分:0)

使用您想要的任何签名在您的班级中定义委托:

delegate int YourDelegate(string s);

获取委托并运行它的方法

void CallerMethod(YourDelegate method)
{
    int result = method("");
}

方法将通过并与YourDelegate兼容:

int MethodToPass(string s)
{
    throw new exception();
}

MethodToPass传递给CallerMewthod

CallerMethod(MethodToPass);

您也可以使用支持任何类型输入和输出的预定义Func<output, inputType1, inputType2, ...>通用委托来代替声明新委托