Action <t>和非参数方法</t>

时间:2014-06-09 13:58:54

标签: c# generics delegates

我正在将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>

2 个答案:

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