【问题标题】:NDesk.Options/Mono.Options: Parameter with multiple key/value pairsNDesk.Options/Mono.Options:具有多个键/值对的参数
【发布时间】:2011-06-05 06:32:29
【问题描述】:

我需要解析以下命令行语法:

MyApplication.exe /p1 key1=value1 key2=value2 key3=value3 /p2

key1, key2 & key3 属于参数 p1。

我在文档中找到了Example #3,它显示了一种解析单个键/值对的方法。

正在使用 NDesk.Options 为单个参数解析多个键/值对

【问题讨论】:

    标签: c# .net command-line mono console-application


    【解决方案1】:

    还有一个更基本的问题:命令行上的 key=value 集的数量是否有限制?

    如果 key=value 集的数量是可变的,那么您希望使用<> default handler 允许的参数运行

    Dictionary<string, string> cur = null;
    Dictionary<string, string> p1 = new Dictionary<string, string>();
    Dictionary<string, string> p2 = new Dictionary<string, string>();
    var p = new OptionSet () {
        { "p1", v => { cur = p1; } },
        { "p2", v => { cur = p2; } },
        { "<>", v => {
            string[] values = v.Split (new[]{'=', ':'}, 2);
            cur.Add (values [0], values [1]);
        } },
    };
    

    这将拆分 /p1 之后的所有 key=value 选项并将它们添加到 p1 字典中:

    p.Parse (new[]{"/p1", "key1=value1", "key2=value2", "/p2"});
    // `p1` now contains { { "key1", "value1" }, {"key2", "value2" } }
    

    出于显而易见的原因,我认为上述方法是合理的。

    但是,如果总是有 3 个集合(因此需要 6 个值),您可以改为创建一个需要 6 个值的 Option 子类:

    class ActionOption<T1, T2, T3, T4, T5, T6> : Option {
        Action<T1, T2, T3, T4, T5, T6> action;
        public ActionOption (string prototype, string description,
                 Action<T1, T2, T3, T4, T5, T6> action)
            : base (prototype, description, 6)
        {
            this.action = action;
        }
    
        protected override void OnParseComplete (OptionContext c)
        {
            action (
                    Parse<T1>(c.OptionValues [0], c)),
                    Parse<T2>(c.OptionValues [1], c)),
                    Parse<T3>(c.OptionValues [2], c)),
                    Parse<T4>(c.OptionValues [3], c)),
                    Parse<T5>(c.OptionValues [4], c)),
                    Parse<T6>(c.OptionValues [5], c)));
        }
    }
    

    然后您可以将此 ActionOption 提供给OptionSet.Add(Option)

    var p = new OptionSet {
        new ActionOption<string, string, string, string, string, string> (
                "p1", null, (a, b, c, d, e, f) => {...}),
    };
    

    【讨论】:

      【解决方案2】:

      NDesk.Options 有特殊的语法来支持这个:

              var pars = new Hashtable();
              var opts = new NDesk.Options.OptionSet{
                  {"p={:}{/}", (n,v) => pars.Add(n, v)}
              };
      

      现在你可以像这样使用命令行运行你的程序了:

      -p=key1:value1 -p=key2/value2
      

      注意,您可以在选项配置中设置对分隔符。在这个例子中是 [:/]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多