Spectre.Console命令行应用开发:参数设置详解

Spectre.Console命令行应用开发:参数设置详解

spectre.console A .NET library that makes it easier to create beautiful console applications. spectre.console 项目地址: https://gitcode.com/gh_mirrors/sp/spectre.console

概述

在开发命令行应用程序时,参数解析是一个核心功能。Spectre.Console.Cli库提供了强大的参数设置系统,通过继承CommandSettings基类并配合特性标注,开发者可以轻松定义各种命令行参数。

基础设置类

创建一个设置类需要继承CommandSettings基类,然后通过特性标注参数:

public sealed class MyCommandSettings : CommandSettings
{
    [CommandArgument(0, "[name]")]
    public string? Name { get; set; }

    [CommandOption("-c|--count")]
    public int? Count { get; set; }
}

这个示例定义了两个参数:一个位置参数和一个选项参数。

位置参数(CommandArgument)

位置参数通过CommandArgument特性定义,具有以下特点:

  1. 位置索引:第一个参数指定参数的位置顺序(从0开始)
  2. 参数名称:使用<>表示必选参数,[]表示可选参数
  3. 多参数支持:可以定义多个位置参数
[CommandArgument(0, "<firstName>")]
public string FirstName { get; set; }

[CommandArgument(1, "[lastName>")]
public string? LastName { get; set; }

选项参数(CommandOption)

选项参数通过CommandOption特性定义,特点包括:

  1. 多名称支持:使用|分隔多个名称(如-c|--count
  2. 命名规则
    • 单字符参数前加单横线(-c
    • 多字符参数前加双横线(--count
  3. 布尔标志:布尔类型参数可以省略值(--debug等同于--debug true
[CommandOption("--debug")]
public bool? Debug { get; set; }

高级特性

1. 隐藏参数

通过设置IsHidden = true可以隐藏参数,不在帮助信息中显示:

[CommandOption("--secret", IsHidden = true)]
public bool? Secret { get; set; }

2. 参数描述

使用Description特性为参数添加描述信息:

[CommandOption("-c|--count")]
[Description("设置输出次数")]
public int Count { get; set; }

3. 默认值

通过DefaultValue特性设置参数默认值:

[CommandOption("-c|--count")]
[DefaultValue(1)]
public int Count { get; set; }

4. 类型转换

支持通过TypeConverter进行复杂类型转换,如枚举值转换:

[CommandOption("-l|--level")]
[TypeConverter(typeof(LogLevelConverter))]
public LogLevel Level { get; set; }

集合参数处理

1. 参数向量

可以定义一个数组类型的参数来接收多个值:

[CommandArgument(0, "[names]")]
public string[] Names { get; set; }

注意:参数向量必须是最后一个位置参数。

2. 选项数组

选项参数也可以定义为数组:

[CommandOption("-n|--name <VALUES>")]
public string[] Names { get; set; }

使用时可以多次指定选项:app.exe --name A --name B --name C

初始化方式

Spectre.Console.Cli支持多种初始化方式:

1. 构造函数初始化

public class Settings : CommandSettings
{
    public Settings(string name)
    {
        Name = name;
    }

    [CommandArgument(0, "[Name]")]
    public string Name { get; }
}

2. Init-only属性

public class Settings : CommandSettings
{
    [CommandArgument(0, "[Name]")]
    public string? Name { get; init; }
}

参数验证

除了基础类型验证外,可以重写Validate方法进行复杂验证:

public override ValidationResult Validate()
{
    if (Name?.Length < 2)
    {
        return ValidationResult.Error("名称至少需要2个字符");
    }
    return ValidationResult.Success();
}

最佳实践

  1. 为所有公共参数添加描述信息
  2. 为常用参数设置合理的默认值
  3. 对关键参数进行验证
  4. 保持参数命名一致性(如统一使用kebab-case)
  5. 隐藏内部使用的参数

spectre.console A .NET library that makes it easier to create beautiful console applications. spectre.console 项目地址: https://gitcode.com/gh_mirrors/sp/spectre.console

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

井唯喜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值