Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我有n个语音命令,它们被转换成字符串,然后根据命令执行_C# - Fatal编程技术网

C# 我有n个语音命令,它们被转换成字符串,然后根据命令执行

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,导致每个命令有n个case。我如何避免它?c代码#

例如:

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()来避免整个开关/案例;还是我完全偏离了轨道?谢谢你的答案,我会试试看。谢谢你的答案,我会试试看。