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
特性定义,具有以下特点:
- 位置索引:第一个参数指定参数的位置顺序(从0开始)
- 参数名称:使用
<>
表示必选参数,[]
表示可选参数 - 多参数支持:可以定义多个位置参数
[CommandArgument(0, "<firstName>")]
public string FirstName { get; set; }
[CommandArgument(1, "[lastName>")]
public string? LastName { get; set; }
选项参数(CommandOption)
选项参数通过CommandOption
特性定义,特点包括:
- 多名称支持:使用
|
分隔多个名称(如-c|--count
) - 命名规则:
- 单字符参数前加单横线(
-c
) - 多字符参数前加双横线(
--count
)
- 单字符参数前加单横线(
- 布尔标志:布尔类型参数可以省略值(
--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();
}
最佳实践
- 为所有公共参数添加描述信息
- 为常用参数设置合理的默认值
- 对关键参数进行验证
- 保持参数命名一致性(如统一使用kebab-case)
- 隐藏内部使用的参数
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考