Подтвердить что ты не робот

С# Передача метода в качестве параметра другому методу

У меня есть метод, который вызывается при возникновении исключения:

public void ErrorDBConcurrency(DBConcurrencyException e)
{
    MessageBox.Show("You must refresh the datasource");
}

Что бы я хотел сделать, это передать эту функцию методу, поэтому, если пользователь нажимает "Да", тогда метод вызывается, например.

public void ErrorDBConcurrency(DBConcurrencyException e, something Method)
{
    if (MessageBox.Show("You must refresh the datasource") == DialogResult.OK)
        Method();
}

Метод может иметь или не иметь параметров, если это так, я тоже хотел бы передать их.

Как я могу это понять?

4b9b3361

Ответ 1

Вы можете использовать Action тип делегата.

public void ErrorDBConcurrency(DBConcurrencyException e, Action method)
{
    if (MessageBox.Show("You must refresh the datasource") == DialogResult.OK)
        method();
}

Затем вы можете использовать его следующим образом:

void MyAction()
{

}

ErrorDBConcurrency(e, MyAction); 

Если вам нужны параметры, вы можете использовать выражение лямбда.

ErrorDBConcurrency(e, () => MyAction(1, 2, "Test")); 

Ответ 2

Добавьте параметр Action как:

public void ErrorDBConcurrency(DBConcurrencyException e, Action errorAction)
{
   if (MessageBox.Show("You must refresh the datasource") == DialogResult.OK)
       errorAction()
}

а затем вы можете вызвать его так

ErrorDBConcurrency(ex, () => { do_something(foo); });

или

ErrorDBConcurrency(ex, () => { do_something_else(bar, baz); });

Ответ 3

Посмотрите на классы Func и Action. Вы можете достичь этого, используя следующее:

public void ErrorDBConcurrency(DBConcurrencyException e, Action method)
{
    if (MessageBox.Show("You must refresh the datasource") == DialogResult.OK)
        method()
}

public void Method()
{
    // do stuff
}
//....

Вызовите его с помощью

ErrorDBConcurrency(ex, Method)

Посмотрите эту статью для некоторых деталей. Если вы хотите, чтобы ваш метод принимал параметр, используйте Action, Action и т.д. Если вы хотите, чтобы он возвращал значение, используйте Func и т.д. Существует много перегрузок этих общих классов.

Ответ 4

В качестве типа параметра вам необходимо использовать delegate.

Если Method возвращает void, то something Action, Action<T1>, Action<T1, T2> и т.д. ( где T1... Tn - типы параметров для Method).

Если Method возвращает значение типа TR, то something Func<TR>, Func<T1, TR>, Func<T1, T2, TR> и т.д.

Ответ 5

public delegate void MethodHandler(); // The type

public void ErrorDBConcurrency(DBConcurrencyException e, MethodHandler Method) // Your error function

ErrorDBConcurrency (e, new MethodHandler(myMethod)); // Passing the method