2010-03-31 53 views
0

圖書館從命令行解析API - 類型安全的命令如何

http://blogs.msdn.com/ivo_manolov/archive/2008/12/17/9230331.aspx

http://testapi.codeplex.com/

摘錄使用的第三常用的方法是形成strongly-鍵入來自命令行參數的命令。這是案件時常見的命令行如下:

some-exe COMMAND parameters-to-the-command 

在這種情況下的解析是有點更復雜:

  1. 創建一個類爲每個支持的命令,從派生Command抽象基類並實現預期的Execute方法。
  2. 將預期命令與命令行參數一起傳遞給CommandLineParser.ParseCommand - 該方法將返回一個強類型的Command實例,該實例可以是Execute() - d。

    //實施例#3://樣品用於解析以下命令行: //將Test.exe運行/的runid = 10 /冗長 //在這個特定的情況下,我們對命令 - 有一個實際的命令行(「運行」),我們想要有效地反序列化和執行。

    public class RunCommand : Command 
    { 
    bool? Verbose { get; set; } 
    int? RunId { get; set; } 
    public override void Execute() 
        { 
        // Implement your "run" execution logic here. 
        } 
    } 
        Command c = new RunCommand(); 
        CommandLineParser.ParseArguments(c, args); 
        c.Execute(); 
    

============================

如果我們實例我不明白在解析參數之前的特定類,命令行參數「run」的重點是什麼,這是第一個參數。我認爲這個想法是基於命令行參數實例化和執行命令/類(「run」參數變爲實例RunCommand類,「walk」變爲WalkCommand類等等)。它可以用最新版本完成嗎?此外,我從codeplex下載的文件不能以上述方式工作,並且不接受沒有斜槓的第一個參數。所以如果使用反射,我必須像通常的參數一樣傳遞命令名,然後執行多步驟 - 確定類名,通過反射實例化,然後通過ParseArguments解析其他參數。

回答

0

MicMit, 我的博客上的例子實際上是有缺陷的。我已經糾正它。

從本質上說,你做的是:1。 解析第一個參數(命令名),以弄清楚什麼命令你需要實例 2.實例化對象命令,然後在參數列表的其餘部分傳遞到它。 3.執行命令

即在你的主,你會做類似下面的...

if (String.Compare(args[0], "run", StringComparison.InvariantCultureIgnoreCase) == 0) 
{ 
    Command c = new RunCommand(); 
    c.ParseArguments(args.Skip(1)); // or CommandLineParser.ParseArguments(c, args.Skip(1)) 
    c.Execute(); 
} 

希望有所幫助。

+0

我想通了,但博客編輯值得接受它作爲答案。 – MicMit 2010-06-18 06:37:10