2014-01-31 2 views
5

У меня есть метод LoadData, который получает данные из базы данных и заполняет 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

Для метода без параметров и возвращения недействительным, вы можете использовать Action:

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

Если у вас есть какие-то параметры или тип возвращаемого значения, используйте Func

+0

Спасибо, и что если я имел параметры? –

+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, используйте Action < ...>, если вы хотите передать 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(); 
} 

pass MethodToPass до CallerMewthod:

CallerMethod(MethodToPass); 

также вы можете вместо того, чтобы объявить новые делегаты, вы можете использовать предопределенный Func<output, inputType1, inputType2, ...> общий делегат, который поддерживает любой тип ввода и вывода

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