如何避免切换情况
本文关键字:情况 何避免 | 更新日期: 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();
}