我正在将Action用于稍后在另一个模块中调用的重试操作方法。使用此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);
你有一些模式或建议如何处理它?</ p>
答案 0 :(得分:7)
关于你的评论:
两个
ShowWarningMessageDialog
都这样做。如果用户需要,他们会将retryAction
发送给MessageDialog
来调用它。至于我,它闻起来有代码重复。
然后消除重复。我会编写三个方法,如下所示:
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.
}
现在您拥有了所有可能需要的签名,实际代码只在一个地方。
答案 1 :(得分:4)
只需发送无参数委托(Action
)并使用lambda来关闭函数可能需要或可能不需要的任何变量。所以签名(唯一超载)将成为:
void ShowWarningMessageDialog<T>(string infoMessage, Action retryAction)
如果您有参数(或任何数量的参数),您可以像这样调用方法:
ShowWarningMessageDialog("hello world",
() => someInstance.SomeMethod(someParameter));