动作和非参数方法
本文关键字:参数 方法 动作 | 更新日期: 2023-09-27 18:07:59
我正在使用 Action 作为稍后在另一个模块中调用的重试操作方法。使用此操作的方法的签名如下
void ShowWarningMessageDialog<T>(string infoMessage, Action<T> retryAction, T parameter);
在某些情况下,我需要发送没有参数的重试方法,当然这是不可能的。 我尝试了一些像这样的丑陋解决方案(参数只是假的,没有在方法中使用(
public void Authorize(object parameter = null)
另一种选择是定义两个方法,如下所示,但我也不喜欢这样
void ShowWarningMessageDialog<T>(string infoMessage, Action<T> retryAction, T parameter);
void ShowWarningMessageDialog(string infoMessage, Action retryAction);
你有一些模式或建议如何处理它吗?
关于您的评论:
ShowWarningMessageDialog
都做同样的事情。他们向MessageDialog
发送retryAction
,如果用户愿意,可以调用它。至于我,它闻起来有代码重复的味道。
然后消除重复。我会写三种方法,如下所示:
void ShowWarningMessageDialog<T>(
string infoMessage,
Action<T> retryAction,
T parameter)
{
// Do no work here; defer to other method.
ShowWarningMessageDialog(infoMessage, ()=>{retryAction(parameter);});
}
void ShowWarningMessageDialog<T>(
string infoMessage,
Action<T> retryAction)
{
// Do no work here; defer to other method.
ShowWarningMessageDialog(infoMessage, retryAction, default(T));
}
void ShowWarningMessageDialog(
string infoMessage,
Action retryAction)
{
// Actually do the work here.
}
现在,您拥有了可能需要的所有签名,并且实际代码仅在一个位置。
只需发送一个无参数委托 ( Action
( 并使用 lambda 关闭函数可能需要或不需要的任何变量。 因此,(唯一重载的(签名将变为:
void ShowWarningMessageDialog<T>(string infoMessage, Action retryAction)
如果你有一个参数(或任意数量的参数(,你将像这样调用该方法:
ShowWarningMessageDialog("hello world",
() => someInstance.SomeMethod(someParameter));