С# Передача метода в качестве параметра другому методу
У меня есть метод, который вызывается при возникновении исключения:
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();
}
Метод может иметь или не иметь параметров, если это так, я тоже хотел бы передать их.
Как я могу это понять?
Ответы
Ответ 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