C# 选项:如何正确注册所需参数?
我试图通过以下方式使用C# 选项:如何正确注册所需参数?,c#,.net,command-line,command-line-arguments,C#,.net,Command Line,Command Line Arguments,我试图通过以下方式使用OptionSet类: string resultsFileName = null; bool isHelp = false; var p = new OptionSet() { { "r=|resultsFile=", "The file with the results", v => { resultsFileName = v; } } { "h|help", "Show this help", v => { isHelp =
OptionSet
类:
string resultsFileName = null;
bool isHelp = false;
var p = new OptionSet() {
{ "r=|resultsFile=", "The file with the results", v => { resultsFileName = v; } }
{ "h|help", "Show this help", v => { isHelp = (v != null); } },
};
try
{
p.Parse(args);
}
catch (OptionException e)
{
Console.WriteLine("Invalid arguments: " + e.Message);
ShowHelp(p);
return;
}
因此,预计需要resultsFile
选项(根据文档:)。但是,当我按原样运行程序时(即没有命令行参数),不会引发异常。请帮忙
更新:在调试器中,当没有提供命令行选项时,将永远无法使用私有void AssertValid(int index)
方法来抛出新的OptionException这是的副本,并且:NDesk.options不支持该选项
引用我自己的话:
根据文档,选项规范中的=
不适用于OptionSet作为一个整体,而仅适用于该特定选项的值
<>这很重要,它只在两个场景中相关,所以首先让我们考虑OpTySSET解析器:
string a = null;
string b = null;
var options = new OptionSet {
{ "a=", v => a = v },
{ "b=", v => b = v },
};
场景1中很重要的一点是OptionSet.Parse()以单次传递、仅向前的方式工作,并且不查看选项值以确定它们是否“应该”为值。因此,考虑:
options.Parse(new[]{"-a", "-b"});
这将导致a
具有值“-b”
,b
为null
。由于-a
的处理程序需要一个值,因此它总是获得以下值(除非该值“编码”到原始选项中,例如-a=value
)
第二个重要的地方是,当需要价值的选项是最后一个选项,并且没有为其提供价值时:
options.Parse(new[]{"-a"});
这将抛出OptionException,因为-a
的处理程序需要一个值,而不存在任何值
因此,如果您有一个本身是必需的选项(与需要值的选项相反),则需要手动检查:
string dir = null;
new OptionSet {
{ "o=", v => dir = v },
}.Parse (args);
if (dir == null)
throw new InvalidOperationException ("Missing required option -o=DIR");
谢谢你的快速回答!(不过,有点小意思的是,该功能不受支持,因为它有助于命令行参数验证的健壮性)。