2012-05-18 3 views
2

У меня есть этот кусок кода, который принимает одну функцию без параметров и возвращает ее время выполнения.Передача функции с несколькими параметрами в качестве параметра

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

Я хотел бы преобразовать его, чтобы принимать непустые функции с параметрами. Я слышал о делегате 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)); 

Update: если вы хотите, возвращаемое значение , вы можете изменить свою 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

Большое спасибо! –

Смежные вопросы