如何使用 System.CommandLine.DragonFruit 将枚举定义为 CLI 选项?

How can I define an enum as CLI option with System.CommandLine.DragonFruit?

我想在 C# 中将枚举定义为 CLI 选项 System.CommandLine.DragonFruit. Is there "builtin" support for this use case? In detail I need an equivalent to Python's click 实现:

@click.option('-m', '--mode', required=True, type=click.Choice(['SIM_MRM', 'SPECTRUM'], case_sensitive=True), help="The measurement mode.")

如果我在 C# 控制台应用程序中定义以下内容

using System;

namespace EndDeviceAgent
{
    class Program
    {
        enum MeasurementMode : short
        {
            SIM_MRM,
            SPECTRUM
        }

        /// <param name="mode">The measurement mode.</param>
        static void Main(MeasurementMode mode)
        {
            Console.WriteLine($"Mode: {mode}");
        }
    }
}

我得到 Mode: SIM_MRM 作为输出。但是我想得到一个异常,因为该选项是必需的,我不希望枚举隐含默认值。

我不知道System.CommandLine,但一个简单的方法可能是在枚举中添加一个默认值并在开始时检查模式以抛出异常:

enum MeasurementMode
{
  NONE,
  SIM_MRM,
  SPECTRUM
}

static void Main(MeasurementMode mode)
{
  if ( mode == MeasurementMode.None ) 
    throw new ArgumentException("A mode value other than NONE must be provided.");

  Console.WriteLine($"Mode: {mode}");
}

也许存在更好的解决方案,例如应用需求的属性,以便您有空时可以检查documentation or source code

我删除了 short 关键字,因为不需要它,除非您有充分的理由使用它(在任何 x32/x64 系统上默认占用 4 个字节)。

Olivier Rogier 的回答没有错,使用初始 NONE 值也是我的第一个想法。 我想提供一个替代方案:使用 Nullable 类型。这也可以与 int 等其他简单值类型一起使用,以强制用户明确提供值。

static void Main(Nullable<MeasurementMode> mode)
{
    if (!mode.HasValue) 
        throw new ArgumentException("A mode value must be provided.");

    Console.WriteLine($"Mode: {mode.Value}");
}

或同等但更短

static void Main(T? mode)
{
    if (mode == null) 
        throw new ArgumentException("A mode value must be provided.");

    Console.WriteLine($"Mode: {mode.Value}");
}