C# 我有n个语音命令,它们被转换成字符串,然后根据命令执行
但问题是,我最终编写了一个Switch case,导致每个命令有n个case。我如何避免它?c代码# 例如:C# 我有n个语音命令,它们被转换成字符串,然后根据命令执行,c#,C#,但问题是,我最终编写了一个Switch case,导致每个命令有n个case。我如何避免它?c代码# 例如: switch () { case "Open File": //do something; break; case "Change color": //do something; break; . . . case n: // do smething; break; } 您可以将每个命令包装在其自己的处理程序中,如下所示: public interface
switch ()
{
case "Open File":
//do something;
break;
case "Change color":
//do something;
break;
.
.
.
case n:
// do smething;
break;
}
您可以将每个命令包装在其自己的处理程序中,如下所示:
public interface ICommandHandler
{
string HandlesCommand { get; }
void Execute();
}
public class OpenFileCommandHandler : ICommandHandler
{
public string HandlesCommand => "Open File";
public void Execute()
{
Console.WriteLine("Open File");
}
}
public class ChangeColorCommandHandler : ICommandHandler
{
public string HandlesCommand => "Change Color";
public void Execute()
{
Console.WriteLine("Change color");
}
}
如果您有一个IoC容器,通常可以通过请求IEnumerable
来注入类中的所有处理程序。如果没有IoC容器,可以将所有处理程序放在这样的数组中
private ICommandHandler[] _commandHandlers = {new OpenFileCommandHandler(), new ChangeColorCommandHandler()};
var command = "Open File";
var handlers = _commandHandlers.Where(c => c.HandlesCommand == command);
foreach (var handler in handlers)
{
handler.Execute();
}
然后您可以找到一个命令的所有处理程序,并像这样执行它们
private ICommandHandler[] _commandHandlers = {new OpenFileCommandHandler(), new ChangeColorCommandHandler()};
var command = "Open File";
var handlers = _commandHandlers.Where(c => c.HandlesCommand == command);
foreach (var handler in handlers)
{
handler.Execute();
}
这还有一个优点,即您可以在不更改任何现有代码的情况下添加新的命令处理程序。您可以将每个命令包装在其自己的处理程序中,如下所示:
public interface ICommandHandler
{
string HandlesCommand { get; }
void Execute();
}
public class OpenFileCommandHandler : ICommandHandler
{
public string HandlesCommand => "Open File";
public void Execute()
{
Console.WriteLine("Open File");
}
}
public class ChangeColorCommandHandler : ICommandHandler
{
public string HandlesCommand => "Change Color";
public void Execute()
{
Console.WriteLine("Change color");
}
}
如果您有一个IoC容器,通常可以通过请求IEnumerable
来注入类中的所有处理程序。如果没有IoC容器,可以将所有处理程序放在这样的数组中
private ICommandHandler[] _commandHandlers = {new OpenFileCommandHandler(), new ChangeColorCommandHandler()};
var command = "Open File";
var handlers = _commandHandlers.Where(c => c.HandlesCommand == command);
foreach (var handler in handlers)
{
handler.Execute();
}
然后您可以找到一个命令的所有处理程序,并像这样执行它们
private ICommandHandler[] _commandHandlers = {new OpenFileCommandHandler(), new ChangeColorCommandHandler()};
var command = "Open File";
var handlers = _commandHandlers.Where(c => c.HandlesCommand == command);
foreach (var handler in handlers)
{
handler.Execute();
}
这还有一个优点,即您可以在不更改任何现有代码的情况下添加新的命令处理程序。到底是什么问题?你想避免什么?一个开关听起来很合理,你给我们的信息很小。如果你有很多这样的开关…你可以考虑工厂模式。perhaps@rory.ap:有200多个命令,不值得写200个大小写。这就是我试图避免的。此外,命令可以是任意长度的,它不遵循特定的模式。那么,您需要研究编写专门的类来处理命令和/或命令类别。建议使用@Ctznkane525等工厂模式。C#是一种面向对象的编程语言,所以请利用它。使用一个接口,例如ICommand,它提供一个方法“Execute()”,怎么样?然后可以通过调用ICommand.Execute()来避免整个开关/案例;还是我完全偏离了轨道?到底是什么问题?你想避免什么?一个开关听起来很合理,你给我们的信息很小。如果你有很多这样的开关…你可以考虑工厂模式。perhaps@rory.ap:有200多个命令,不值得写200个大小写。这就是我试图避免的。此外,命令可以是任意长度的,它不遵循特定的模式。那么,您需要研究编写专门的类来处理命令和/或命令类别。建议使用@Ctznkane525等工厂模式。C#是一种面向对象的编程语言,所以请利用它。使用一个接口,例如ICommand,它提供一个方法“Execute()”,怎么样?然后可以通过调用ICommand.Execute()来避免整个开关/案例;还是我完全偏离了轨道?谢谢你的答案,我会试试看。谢谢你的答案,我会试试看。