.net core 使用AddCommandLine后如何检索args数组

.net core 使用AddCommandLine后如何检索args数组,.net-core,command-line-parser,.net Core,Command Line Parser,我正在为一个控制台应用程序开发POC,在设置中使用AddCommandLine之后,我正在努力从配置中检索命令行值 csproj <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> 执行命中DoWork方法。很好,但是DeleteOpt

我正在为一个控制台应用程序开发POC,在设置中使用AddCommandLine之后,我正在努力从配置中检索命令行值

csproj

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
执行命中DoWork方法。很好,但是DeleteOptions.cs定义了一个动词,目的是添加更多命令。因此,还有更多的工作要做,但要走正确的道路


[编辑]我还意识到我不需要添加
AddCommandLine()
调用,因为它们是默认添加的。

好吧,我似乎把这件事复杂化了,结果是:

public static class Program
{
    public static async Task Main(string[] args)
    {
        var builtHost = CreateHostBuilder(args).Build();

        var console = builtHost.Services.GetService<ConsoleApp>();
        await console.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
         Host.CreateDefaultBuilder(args)
             .UseSerilog()
             .ConfigureAppConfiguration((hostingContext, config) =>
             {
                  config.AddJsonFile("settings.json", true, true);
                  config.AddCommandLine(args);
             })
             .ConfigureServices((hostcontext, services) =>
             {
                 services.AddTransient<ConsoleApp>();
             });
}
公共静态类程序
{
公共静态异步任务主(字符串[]args)
{
var builhost=CreateHostBuilder(args.Build();
var console=buildhost.Services.GetService();
wait console.Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.useserlog()
.ConfigureAppConfiguration((hostingContext,config)=>
{
config.AddJsonFile(“settings.json”,true,true);
config.AddCommandLine(args);
})
.ConfigureServices((主机上下文,服务)=>
{
services.AddTransient();
});
}
这是ConsoleApp中的run方法:

public Task Run()
{
    while (true)
    {
       var input = ReadFromConsole();
       if (string.IsNullOrWhiteSpace(input))
       {
           continue;
       }
       else if (input.ToLower().Equals("exit"))
       {
           break;
       }
       else
       {
              Parser.Default.ParseArguments<DeleteOptions, ConcatOptions,   DownloadOptions, ReportOptions>(input.Split(" "))
                        .WithParsed<DeleteOptions>(async options => await options.DoWork())
                        .WithParsed<ConcatOptions>(async options => await options.DoWork())
                        .WithParsed<DownloadOptions>(async options => await options.DoWork())
                        .WithParsed<ReportOptions>(async options => await options.DoWork())
                        .WithNotParsed(HandleParseError);
        }
  }

  return Task.CompletedTask;
}
公共任务运行()
{
while(true)
{
var input=ReadFromConsole();
if(string.IsNullOrWhiteSpace(输入))
{
继续;
}
else if(input.ToLower().Equals(“exit”))
{
打破
}
其他的
{
Parser.Default.ParseArguments(input.Split(“”)
.WithParsed(异步选项=>await options.DoWork())
.WithParsed(异步选项=>await options.DoWork())
.WithParsed(异步选项=>await options.DoWork())
.WithParsed(异步选项=>await options.DoWork())
.未解析(HandleParseError);
}
}
返回Task.CompletedTask;
}
这可以让我把它作为一个交互式控制台应用程序使用。不过,我确实对DI有问题。我已经创建了一个OptionsBase类来设置日志记录,我是这样做的,因为尝试向任何选项类添加参数都失败,无法找到无参数构造函数。所以我假设命令行需要默认构造函数才能工作。以我现有的方式获取记录器会给我多个日志文件,因此我需要修复它

var args = config.GetValue<string>("delete");
            string[] arguments = null;
            if(!string.IsNullOrEmpty(args))
            {
                var tempArgs = args.Split(" ");
                arguments = new string[tempArgs.Length + 1];
                arguments[0] = "delete";
                for(int i = 0; i < tempArgs.Length; ++i)
                {
                    arguments[i + 1] = tempArgs[i];
                }
            }

            Parser.Default.ParseArguments<DeleteOptions>(arguments)
                .WithParsed<DeleteOptions>(async c => await c.Dowork())
                .WithNotParsed(HandleParseError);
public static class Program
{
    public static async Task Main(string[] args)
    {
        var builtHost = CreateHostBuilder(args).Build();

        var console = builtHost.Services.GetService<ConsoleApp>();
        await console.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
         Host.CreateDefaultBuilder(args)
             .UseSerilog()
             .ConfigureAppConfiguration((hostingContext, config) =>
             {
                  config.AddJsonFile("settings.json", true, true);
                  config.AddCommandLine(args);
             })
             .ConfigureServices((hostcontext, services) =>
             {
                 services.AddTransient<ConsoleApp>();
             });
}
public Task Run()
{
    while (true)
    {
       var input = ReadFromConsole();
       if (string.IsNullOrWhiteSpace(input))
       {
           continue;
       }
       else if (input.ToLower().Equals("exit"))
       {
           break;
       }
       else
       {
              Parser.Default.ParseArguments<DeleteOptions, ConcatOptions,   DownloadOptions, ReportOptions>(input.Split(" "))
                        .WithParsed<DeleteOptions>(async options => await options.DoWork())
                        .WithParsed<ConcatOptions>(async options => await options.DoWork())
                        .WithParsed<DownloadOptions>(async options => await options.DoWork())
                        .WithParsed<ReportOptions>(async options => await options.DoWork())
                        .WithNotParsed(HandleParseError);
        }
  }

  return Task.CompletedTask;
}