我正在做一个需要非常扩展的项目。它是关于根据字符串代码或枚举值执行操作。我现在使用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)

09-15 19:10