C # Передача метода в качестве параметра другому методу - PullRequest
16 голосов
/ 24 марта 2011

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

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();
}

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

Как я могу добиться этого?

Ответы [ 5 ]

28 голосов
/ 24 марта 2011

Вы можете использовать тип делегата 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")); 
6 голосов
/ 24 марта 2011

Добавьте 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); });
4 голосов
/ 24 марта 2011

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

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

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

2 голосов
/ 24 марта 2011

Посмотрите на классы 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 и т. Д. Существует много перегрузок этих универсальных классов.

1 голос
/ 24 марта 2011
public delegate void MethodHandler(); // The type

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

ErrorDBConcurrency (e, new MethodHandler(myMethod)); // Passing the method
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...