2014-01-31 226 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); 

也可以代替宣告一個新的代表,您可以使用支持任何類型的輸入和輸出的

相關問題