我需要解析下面的命令行的語法:NDesk.Options/Mono.Options:參數與多個鍵/值對
MyApplication.exe /p1 key1=value1 key2=value2 key3=value3 /p2
KEY1,KEY2 & KEY3屬於參數P1。
我在文檔中找到了Example #3,它顯示瞭解析單個鍵/值對的方法。
是多個鍵/值對解析與NDesk.Options
我需要解析下面的命令行的語法:NDesk.Options/Mono.Options:參數與多個鍵/值對
MyApplication.exe /p1 key1=value1 key2=value2 key3=value3 /p2
KEY1,KEY2 & KEY3屬於參數P1。
我在文檔中找到了Example #3,它顯示瞭解析單個鍵/值對的方法。
是多個鍵/值對解析與NDesk.Options
有比賽中的一個更基本的問題可能一個參數:是那裏的命令行中的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個值的選項的子類:
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) => {...}),
};
NDesk.Options具有特殊的語法來詢問服務正是這一點:
var pars = new Hashtable();
var opts = new NDesk.Options.OptionSet{
{"p={:}{/}", (n,v) => pars.Add(n, v)}
};
現在210
你可以用這樣的命令行運行您的程序:
-p=key1:value1 -p=key2/value2
請注意,您可以設置對分隔符中選擇配置。在這個例子中它是[:/]