WPF命令行参数路由

时间:2013-11-18 22:21:31

标签: c# wpf methods parameters command-line-arguments

我有一个我正在开发的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

我可以从字典中读到这个。然后执行相关方法。

我的问题是将任务参数“路由”到特定方法的最佳方法是什么。我还将在需要传递给方法的任务之后传递其他参数。

3 个答案:

答案 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启动之前进行处理(如果需要)。如果你需要,我会编辑。