如何避免切换情况

本文关键字:情况 何避免 | 更新日期: 2023-09-27 18:27:18

请问,我如何重构此代码以避免切换情况?我需要使用字典吗?有没有一种方法可以在不添加新案例的情况下更改命令并使其自动。。。我的意思是,这个解决方案将不取决于案件数量。我希望我的问题是清楚的。

    static void Main(string[] args)
    {
        ConsoleHelp ch1 = new ConsoleHelp();
        Plus pl = new Plus();
        Minus mn = new Minus();
        Divide dv = new Divide();
        Multiply mlt = new Multiply();
        Sinus sin = new Sinus();
        Tangent tan = new Tangent();
        Square sq = new Square();
        Degree dg = new Degree();
        Percent pr = new Percent();
        while (true)
        {
            Console.Write("command> ");
            string com = Console.ReadLine();
            if (com != null)
            {
                switch (com.ToLower())
                {
                    case "?":
                        ch1.Helpper();
                        break;
                    case "plus":
                        pl.Sum();
                        break;
                    case "minus":
                        mn.Minusvalue();
                        break;
                    case "divide":
                        dv.Dividevalue();
                        break;
                    case "multiply":
                        mlt.Multvalue();
                        break;
                    case "sinus":
                        sin.Sinusvalue();
                        break;
                    case "tangent":
                        tan.Tangentvalue();
                        break;
                    case "square":
                        sq.Squarevalue();
                        break;
                    case "degree":
                        dg.Degvalue();
                        break;
                    case "percent":
                        pr.Pervalue();
                        break;
                    case "c":
                        Environment.Exit(0);
                        break;
                    default:
                        Console.WriteLine("The command is not supported. Enter one of the valid commands.");
                        break;
                }
            }
        }
        Console.ReadLine();
    }

如何避免切换情况

可以执行以下操作之一:

Dictionary<String, Action> myActions = new Dictionary<String, Action>() {
    {"One", delegate { ActionA(); }},
    {"Two", delegate { ActionB(); }},
    {"Three", delegate { ActionC(); }},
    {"Four", delegate { ActionD(); }}
};
myActions["StringInput"]();

定义字典时,请确保您有权访问外部类,以便可以关闭它们。

问题似乎是"如何为操作找到许多命名的处理程序"。

一些可能的选择:

  • 处理程序(委托或接口)的命令名称字典
  • 使用自定义属性(根据需要,可以是方法,也可以是整个类)标记处理程序,并使用反射来查找所有处理程序。即[CustomCommand(Name="percent")]
  • 使用具有命名实例的依赖注入容器(如Unity)来添加"命令处理程序"接口的许多实现
  • 只需使用"命令处理程序"接口作为标记,并通过反射找到实现它的所有类

尽管在示例中使用switch没有错,但您可以使用Dictionary<string, action>将命令映射到适当的操作:

static void Main(string[] args)
{
    ConsoleHelp ch1 = new ConsoleHelp();
    Plus pl = new Plus();
    Minus mn = new Minus();
    Divide dv = new Divide();
    Multiply mlt = new Multiply();
    Sinus sin = new Sinus();
    Tangent tan = new Tangent();
    Square sq = new Square();
    Degree dg = new Degree();
    Percent pr = new Percent();
    var commands = new Dictionary<string, Action>(StringComparer.InvariantCultureIgnoreCase)
        {
            { "?", ch1.Helper },
            { "plus", p1.Sum },
            { "minus", mn.MinusValue },
            { "divide", dv.DivideValue },
            { "multiply", mlt.Multvalue },
            { "sinus", sin.Sinusvalue }, 
            { "tangent", tan.Tangentvalue }, 
            { "square", sq.Squarevalue }, 
            { "degree", dg.Degvalue }, 
            { "percent", pr.Pervalue}, 
            { "c", () => Environment.Exit(0) }
        };
    while (true)
    {
        Console.Write("command> ");
        string com = Console.ReadLine();
        if (!String.IsNullOrEmpty(com))
        {
            Action action;
            if(commands.TryGetValue(com))
                action();
            else
                Console.WriteLine("The command is not supported. Enter one of the valid commands.");
        }
    }
}

字典可以帮助您

var dic = new Dictionary<string, Action>();
dic.Add("divide", () => dv.Dividevalue());
var com = "div";
dic[com]();

当然,你必须检查命令是否已注册,也许是

Action action = null;
if (dic.TryGetValue(com, ou action))
{
    action();
}