动作和非参数方法

本文关键字:参数 方法 动作 | 更新日期: 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);

你有一些模式或建议如何处理它吗?

动作<T>和非参数方法

关于您的评论:

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));