我有一个我正在开发的WPF应用程序。我有40个左右的方法可以通过UI访问,但也需要通过命令行传递参数来执行。
目前我有以下内容,它允许我捕获App.xaml.cs上的参数......
public partial class App : Application
{
string[] args = MyApplication.GetCommandLineArgs();
Dictionary<string, string> dictionary = new Dictionary<string, string>();
private void Application_Startup(object sender, StartupEventArgs e)
{
for (int index = 1; index < args.Length; index += 2)
{
dictionary.Add(args[index], args[index + 1]);
}
if (dictionary.Keys.Contains("/Task"))
{
MessageBox.Show("There is a Task");
}
}
}
}
我希望通过命令行在每次调用开始时传递一个参数。如果我通过
/任务ThisIsTheTask
我可以从字典中读到这个。然后执行相关方法。
我的问题是将任务参数“路由”到特定方法的最佳方法是什么。我还将在需要传递给方法的任务之后传递其他参数。
答案 0 :(得分:1)
如果您能够使用第三方开源库,我建议您查看ManyConsole,可以通过NuGet here获取。
ManyConsole允许您定义ConsoleCommand
实现(请参阅here以获取示例实现),其中可以包含许多参数。然后,您可以使用ConsoleCommandDispatcher
根据命令行参数路由到相应的ConsoleCommand
实现(有关示例,请参阅here)。
我与ManyConsole没有任何关系,但我使用了该库并发现它非常有效。
答案 1 :(得分:1)
它可以被认为是服务定位器反模式的一种实现,但一种简单的方法就是具有如下内容:
private readonly Dictionary<string, Action<string[]>> commands = new Dictionary<string, Action[]>
{
{"Task1", args => Task1Method(args[0], Int32.Parse(args[1]))}
}
private static Task1Method(string firstArgs, int secondArg)
{
}
然后,您的代码可以为命令行中指定的任务找到Action<string[]>
,并将其余参数传递给Action
,例如
var commandLineArgs = Environment.GetCommandLineArgs();
var taskName = commandLineArgs[1];
// Locate the action to execute for the task
Action<string[]> action;
if(!commands.TryGetValue(taskName, out action))
{
throw new NotSupportedException("Task not found");
}
// Pass only the remaining arguments
var actionArgs = new string[commandLineArgs.Length-2];
commandLineArgs.CopyTo(actionArgs, 2);
// Actually invoke the handler
action(actionArgs);
答案 2 :(得分:0)
我建议在程序的应用程序类中公开它们的一个(或多个)属性。然后可以使用类似
之类的东西来完成运行时的访问(Application.Current as App).MyTask
然后可以进一步包装以方便使用。 此外,您也可以在WPF中编写自己的“Main”方法 - 这样您就可以更轻松地访问参数数组,并且可以在WPF启动之前进行处理(如果需要)。如果你需要,我会编辑。