C#将方法作为参数传递给另一个方法

Sim*_*mon 16 c# methods

我有一个在发生异常时调用的方法:

public void ErrorDBConcurrency(DBConcurrencyException e)
{
    MessageBox.Show("You must refresh the datasource");
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是将此函数传递给方法,因此如果用户单击是,则调用该方法,例如

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

方法可能有也可能没有参数,如果是这种情况我也想传递它们.

我怎么能做到这一点?

Cha*_*ion 30

您可以使用Action委托类型.

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

然后你可以像这样使用它:

void MyAction()
{

}

ErrorDBConcurrency(e, MyAction); 
Run Code Online (Sandbox Code Playgroud)

如果确实需要参数,可以使用lambda表达式.

ErrorDBConcurrency(e, () => MyAction(1, 2, "Test")); 
Run Code Online (Sandbox Code Playgroud)


Chr*_*Wue 7

添加Actionas参数:

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

然后你就可以这样称呼它

ErrorDBConcurrency(ex, () => { do_something(foo); });
Run Code Online (Sandbox Code Playgroud)

要么

ErrorDBConcurrency(ex, () => { do_something_else(bar, baz); });
Run Code Online (Sandbox Code Playgroud)