Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Passing a method as a parameter to another method [duplicate]

Tags:

methods

c#

I have a method that is called when an exception occurs:

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

What i would like to do is pass this function a method so if the user clicks Yes then the method is called e.g.

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

The Method may or may not have parameters, if this is the case i would like to pass them too.

How can i acheive this?

like image 207
Simon Avatar asked Mar 24 '11 03:03

Simon


3 Answers

You can use the Action delegate type.

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

Then you can use it like this:

void MyAction()
{

}

ErrorDBConcurrency(e, MyAction); 

If you do need parameters you can use a lambda expression.

ErrorDBConcurrency(e, () => MyAction(1, 2, "Test")); 
like image 67
ChaosPandion Avatar answered Oct 30 '22 08:10

ChaosPandion


Add an Action as parameter:

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

and then you can call it like this

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

or

ErrorDBConcurrency(ex, () => { do_something_else(bar, baz); });
like image 8
ChrisWue Avatar answered Oct 30 '22 09:10

ChrisWue


You need to use a delegate as the parameter type.

If Method returns void, then something is Action, Action<T1>, Action<T1, T2>, etc (where T1...Tn are the parameter types for Method).

If Method returns a value of type TR, then something is Func<TR>, Func<T1, TR>, Func<T1, T2, TR>, etc.

like image 4
Jon Avatar answered Oct 30 '22 08:10

Jon