我正在做一个需要非常扩展的项目。它是关于根据字符串代码或枚举值执行操作。我现在使用switch-case语句并手动调用方法。
我想做的是遍历数据库记录(并最终获得枚举值或字符串代码),调用方法“ PerformAction”并使以后实现类或方法成为可能。
public bool PerformAction(ActionToPerform actionToPerform)
{
bool isPerformed = false;
switch (actionToPerform.Action.Code)
{
case "MAIL":
isPerformed = Actions.SendEmail(actionToPerform);
break;
case "RESTART":
isPerformed = Actions.RestartSendport();
break;
case "EVENT-LOG":
isPerformed = Actions.AddToEventLog();
break;
}
//Do some more
return isPerformed;
}
我希望以后能够实现诸如SendEmail,RestartSendport和AddToEventLog之类的操作。我知道可以通过反射并为方法指定代码的名称(例如“ MAIL.cs”)来完成此操作,因此我可以避免使用switch大小写并执行一个调用。
我需要在另一个库中保持动态性,因此我想知道是否存在针对此类问题的最佳实践或良好的设计模式。
最佳答案
您可以从创建字典开始:
private Dictionary<ActionType, ActionBase> actions;
因此,除了
switch (currentActionType)
之外,您还可以执行以下操作:if (actions.ContainsKey(currentActionType))
actions[currentActionType].Run(someArgs);
这样,您可以将动作映射与动作调用分开。映射可以在构造函数中完成:
actions[ActionType.SendEmail] = new SendEmailAction();
actions[ActionType.OtherAction] = new OtherAction();
之后,您可以将动作字典提取到单独的
ActionsRepository
并将其作为依赖项注入。存储库可以具有用于在运行时创建映射的方法RegisterAction(ActionType type, ActionBase action)
。