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

时间:2011-03-24 03:45:12

标签: c# methods

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

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 个答案:

答案 0 :(得分:28)

您可以使用Action委托类型。

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

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

void MyAction()
{

}

ErrorDBConcurrency(e, MyAction); 

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

ErrorDBConcurrency(e, () => MyAction(1, 2, "Test")); 

答案 1 :(得分:6)

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

答案 2 :(得分:4)

您需要使用delegate作为参数类型。

如果Method返回void,则somethingActionAction<T1>Action<T1, T2>等(其中T1 ... Tn为Method)的参数类型。

如果Method返回TR类型的值,则somethingFunc<TR>Func<T1, TR>Func<T1, T2, TR>等。

答案 3 :(得分:2)

查看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)

查看this article了解一些细节。如果您希望您的方法获取参数,请使用Action,Action等。如果您希望它返回值,请使用Func等。这些泛型类有许多重载。

答案 4 :(得分:1)

public delegate void MethodHandler(); // The type

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

ErrorDBConcurrency (e, new MethodHandler(myMethod)); // Passing the method