2014-01-31 85 views
5

我有一种名为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()); 

我怎么能这样做?

回答

2

对于一个方法没有参数和返回void,你可以使用Action

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

如果你有一些参数或者返回类型,使用Func

+0

由于预定义Func<output, inputType1, inputType2, ...>泛型委托,如果我有参数? –

+0

使用Func(查看更新的响应) – AlexH

+0

作为最后一个问题,如果我的Func没有参数,但我希望它返回一个int,该怎么办? –

0

使用委托

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

如果你想参数传递给你的方法m,如果你想传递一个int和一个字符串,你的方法中使用的动作< ...>,例如,用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); 
} 

如果您需要访问方法的返回值,使用Func键< ...>:

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); 
} 
0

在类中定义一个委托任何签名,你想:

delegate int YourDelegate(string s); 

是获得委托,并运行它的方法

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

方法要通过,并与YourDelegate兼容:

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

合格MethodToPassCallerMewthod

CallerMethod(MethodToPass); 

也可以代替宣告一个新的代表,您可以使用支持任何类型的输入和输出的

相关问题