我有一个在发生异常时调用的方法:
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();
}
方法可能有也可能没有参数,如果是这种情况我也想传递它们。
我怎样才能实现这个目标?
答案 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
,则something
为Action
,Action<T1>
,Action<T1, T2>
等(其中T1 ... Tn为Method
)的参数类型。
如果Method
返回TR
类型的值,则something
为Func<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