私は、次のコマンドライン構文を解析する必要があります。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
劇中より根本的な問題がありますと可能性、単一のパラメータに対して複数のキー/値のペアのために解析している:コマンドラインでキー=値セットの数に制限はありますか?
キー=値セットの数が可変である場合<>
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
後にすべてのキー=値オプションを分割し、それらを追加しますp1
辞書に:
p.Parse (new[]{"/p1", "key1=value1", "key2=value2", "/p2"});
// `p1` now contains { { "key1", "value1" }, {"key2", "value2" } }
明白な理由のために、私は上記の行くための合理的な方法であることを検討したいです。
しかし、常にあなたの代わりに6つの値を必要とするオプションのサブクラスを作成することができ、3セット(したがって、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)));
}
}
あなたはその後、OptionSet.Add(Option)
にこのActionOptionを提供することができます。
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)}
};
今、あなたは、このようなコマンドラインを使用してプログラムを実行することができます。
-p=key1:value1 -p=key2/value2
お知らせを、あなたはオプションの設定で区切り文字のペアを設定することが可能となります。この例では、[:/]