CommandLineParserを使用すると、次のような相互に排他的なオプションのセットを定義できます ( wikiから取得):
class OptionsMutuallyExclusive
{
//define commands in set(group) named web
[Option(SetName = "web")]
public string DocumentRoot { get; set; }
[Option(SetName = "web")]
public bool EnableJavaScript { get; set; }
//define other commands in set(group) named ftp
[Option(SetName = "ftp")]
public string FtpDirectory { get; set; }
[Option(SetName = "ftp")]
public bool AnonymousLogin { get; set; }
//Common: the next option can be used with any set because it's not included in a set
[Option('r')]
public string UrlAddress { get; set; }
}
これで、このアプリを次のように解析できます ( .Dump()
LinqPad から)
var result = parser.ParseArguments<OptionsMutuallyExclusive>(args);
result.WithParsed(options => options.Dump()).WithNotParsed(errs => errs.Dump());
そしてWithParsed
、次の引数を使用して肯定的な結果 ( ) を取得します。
--enablejavascript --documentroot ~/var/local/website -r http://localhost
--ftpdirectory ~/var/local/ftpsite --anonymouslogin -r ftp://myftp.server
これでエラー(WithNotParsed
)が発生します。
--enablejavascript --anonymouslogin
しかし:どのセットが使用されたかを知る方法はありますか?
web
では、最初の呼び出しで値を取得し、2 回目の呼び出しで値を取得しますftp
か? または、インターフェイスおよび/または派生クラスを使用して、およびのような型付きの結果を取得しWebOptions
ますFtpOptions
か?
異なるクラスを使用ParseArguments
すると、成功するまで複数回呼び出すことができますが、これはあまり良くありません。
私が見つけたすべての例は、どの値が定義されていてどの値が定義されていないかをテストすることによって、常に現在のセットを決定しようとしています。
足りないものはありますか?
代替案はありますか?