首页 > 解决方案 > 命令行解析器库在 C# 中给出“System.Type”错误

问题描述

我正在用 C# 编写控制台应用程序(.NET Framework)。我想使用命令行中的参数,并且我正在尝试使用命令行解析器库来帮助我做到这一点。

这是 Nuget 上的包 - https://www.nuget.org/packages/CommandLineParser/

我从这个 StackOverflow 问题中发现了这一点 - Best way to parse command line arguments in C#?

MWE

using System;
using CommandLine;

namespace CLPtest
{
    class Program
    { 

        class SomeOptions
        {
            [Option('n', "name")]
            public string Name { get; set; }

        }

        static void Main(string[] args)
        {

            var options = new SomeOptions();

            CommandLine.Parser.Default.ParseArguments(args, options);

        }
    }
}

options当我尝试创建一个最小的工作示例时,我在这一行得到一个错误:

CommandLine.Parser.Default.ParseArguments(args, options);

错误是Argument 2: cannot convert from 'CLPtest.Program.SomeOptions' to 'System.Type'

我真的很困惑,因为我在至少 3 个关于如何使用这个库的教程中看到了相同的示例代码。(例如 -使用命令行解析器库解析命令行参数

标签: c#.netcommand-line-arguments

解决方案


(这个答案是在这个库的 v2.7 时写的)

他们的存储库的 README中可以看出,这似乎是 README 中前面提到的 API 更改的一部分。与您引用的示例代码相比,现在似乎对参数的处理方式有所不同。所以,现在你应该在里面做这样的事情Main

...

static void Main(string[] args)
{
    CommandLine.Parser.Default.ParseArguments<SomeOptions>(args);
}

...

要对这些选项进行实际操作,您可以使用这些选项,其中包含您的类WithParsed中定义的选项。SomeOptions

...

static void Main(string[] args)
{
    CommandLine.Parser.Default.ParseArguments<SomeOptions>(args).WithParsed(option =>
    {
        // Do something with your parsed arguments in here...

        Console.WriteLine(option.Name); // This is the property from your SomeOptions class.
    });
}

...

自述文件后面的C# 示例表明,您可以传入一个方法WithParsed来处理您的选项,而不是在Main.


推荐阅读