2012-05-18 141 views
2

我有這段代碼,它接受一個沒有參數的函數,並返回它的運行時。傳遞一個具有多個參數的函數作爲參數

public static Stopwatch With_StopWatch(Action action) 
{ 
    var stopwatch = Stopwatch.StartNew(); 
    action(); 
    stopwatch.Stop(); 
    return stopwatch; 
} 

我想將其轉換爲帶有參數的非void函數。 我聽說過Func <>委託,但我不知道如何使用它。 我需要像這樣(很僞):

public T measureThis(ref Stopwatch sw, TheFunctionToMeasure(parameterA,parameterB)) 
    { 
     sw.Start(); // start stopwatch 
     T returnVal = TheFunctionToMeasure(A,B); // call the func with the parameters 
     stopwatch.Stop(); // stop sw 
     return returnVal; // return my func's return val 
    } 

所以我必須得到通過FUNC的返回值,並獲得最終的秒錶。 任何幫助,非常感謝!

回答

7

您的原始代碼仍然可以工作。人們如何將它稱爲是什麼樣的變化,當你有參數:

With_Stopwatch(MethodWithoutParameter); 
With_Stopwatch(() => MethodWithParameters(param1, param2)); 

您也可以致電與第二語法參數的方法:

With_Stopwatch(() => MethodWithoutParameter()); 
With_Stopwatch(() => MethodWithParameters(param1, param2)); 

更新:如果你想返回值,你可以改變你measureThis功能採取Func<T>,而不是一個行動:

public T measureThis<T>(Stopwatch sw, Func<T> funcToMeasure) 
{ 
    sw.Start(); 
    T returnVal = funcToMeasure(); 
    sw.Stop(); 
    return returnVal; 
} 

Stopwatch sw = new Stopwatch(); 
int result = measureThis(sw,() => FunctionWithoutParameters()); 
Console.WriteLine("Elapsed: {0}, result: {1}", sw.Elapsed, result); 
double result2 = meashreThis(sw,() => FuncWithParams(11, 22)); 
Console.WriteLine("Elapsed: {0}, result: {1}", sw.Elapsed, result); 
+0

謝謝你,但這種技術,我能得到日e返回值? –

+0

如果你對返回值感興趣,那麼你應該通過'Func '代替。我已經編輯了有關它的信息的答案。 – carlosfigueira

+0

非常感謝! –

相關問題