C# 行动<;T>;和非参数方法

C# 行动<;T>;和非参数方法,c#,generics,delegates,C#,Generics,Delegates,我正在对稍后在另一个模块中调用的重试操作方法使用操作。使用此操作的方法的签名如下 void ShowWarningMessageDialog<T>(string infoMessage, Action<T> retryAction, T parameter); 另一个选择是定义如下两种方法,但我也不喜欢这样 void ShowWarningMessageDialog<T>(string infoMessage, Action<T> retryAc

我正在对稍后在另一个模块中调用的重试操作方法使用操作。使用此操作的方法的签名如下

void ShowWarningMessageDialog<T>(string infoMessage, Action<T> retryAction, T parameter);
另一个选择是定义如下两种方法,但我也不喜欢这样

void ShowWarningMessageDialog<T>(string infoMessage, Action<T> retryAction, T parameter);
void ShowWarningMessageDialog(string infoMessage, Action retryAction);
void ShowWarningMessageDialog(字符串infoMessage,Action retryAction,T参数);
void ShowWarningMessageDialog(字符串infoMessage,Action retryAction);

您是否有一些处理方法或建议?

只需发送一个无参数委托(
操作),并使用lambda关闭函数可能需要或不需要的任何变量。因此,(唯一重载的)签名将变成:

void ShowWarningMessageDialog<T>(string infoMessage, Action retryAction)

关于你的评论:

两个
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. 
}
void ShowWarningMessageDialog(
字符串信息消息,
行动再行动,
T参数)
{
//不要在这里工作,请遵循其他方法。
ShowWarningMessageDialog(infoMessage,()=>{retryAction(参数);});
}
无效显示警告消息对话框(
字符串信息消息,
动作(返回动作)
{
//不要在这里工作,请遵循其他方法。
ShowWarningMessageDialog(infoMessage,retryAction,默认值(T));
}
无效显示警告消息对话框(
字符串信息消息,
动作(返回动作)
{
//实际上在这里工作。
}

现在,您已经拥有了可能需要的所有签名,而实际的代码只在一个位置。

您是否认为明智的解决方案(使用两种类型的签名的两种方法)不好?我认为还不错,但这两种
ShowWarningMessageDialog
都是这样做的。他们向MessageDialog发送
retryAction
,如果用户需要,MessageDialog会调用它。对我来说,它有代码重复的味道。这应该以一种表达的方式建模。如果“retryactions”封装的行为超出了简单的委托ShowWarningMessageDialog,则应为其提供设计良好的DirectryAction接口,以实现可扩展性。如果将来需要传递多个参数该怎么办?解决方案如下:
ShowWarningMessageDialog(“hello world”,()=>SomeMethod(someParameter1,someParameter2))。我认为这已经足够了。
ShowWarningMessageDialog("hello world", 
    () => someInstance.SomeMethod(someParameter));
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. 
}