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.
}