您有相互关联的命令和输入参数。对我来说,将这两件事封装到一个对象中并保持它们接近似乎是合乎逻辑的。您可以为此类对象创建接口
public interface ICommand
{
bool CanGetArgumentsFrom(string input);
void Execute();
}
以及实现它的命令
public class CommandA : ICommand
{
public bool CanGetArgumentsFrom(string input)
{
return input.Contains("argA");
}
public void Execute()
{
/* execute command A */
}
}
第二个命令
public class CommandB : ICommand
{
public bool CanGetArgumentsFrom(string input)
{
return input.Contains("argB") && input.Contains("argC");
}
public void Execute()
{
/* execute command B */
}
}
用法非常易读
ICommand[] commands = { new CommandA(), new CommandB() };
foreach(var command in commands)
if (command.CanGetArgumentsFrom(input))
command.Execute();
你甚至可以有方法
public bool TryExecuteCommand(string input)
{
if (!CanGetArgumentsFrom(input))
return false;
Execute();
return true;
}
那么执行会更加简单易读:
foreach(var command in commands)
command.TryExecute(input);
如果您不想创建命名命令,那么您可以使用对象来验证输入并在所有必需参数都到位时执行一些操作
public class Command
{
string[] arguments;
Action action;
public Command(Action action, params string[] arguments)
{
this.action = action;
this.arguments = arguments;
}
public bool TryExecute(string input)
{
if (!arguments.All(input.Contains))
return false;
action();
return true;
}
}
现在使用这个类,您可以创建命令:
var commands = new Command[] {
new Command(_ => /* execute A */, "argA"),
new Command(_ => /* execute B */, "argB", "argC"),
};