C# Passing a method as a parameter to another method

戏子无情 提交于 2019-12-18 11:32:23

问题


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?


回答1:


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")); 



回答2:


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



回答3:


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.




回答4:


Look into the Func and Action classes. You can achieve this using the following:

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

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

Call it using

ErrorDBConcurrency(ex, Method)

Take a look at this article for some details. If you want your method to take a parameter, use Action, Action, etc. If you want it to return a value, use Func etc. There are many overloads of these generic classes.




回答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


来源:https://stackoverflow.com/questions/5414515/c-sharp-passing-a-method-as-a-parameter-to-another-method

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!