You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Spectre.Console的[CommandOption]设置运行时计算的默认值?

在Spectre.Console中为CommandOption设置运行时默认值并同步到帮助文本

问题场景

现有基于Spectre.Console的命令配置类:

public class LogCommandSettings : CommandSettings
{
    [CommandOption("--logFile")]
    [Description("Path and file name for logging")]
    [DefaultValue("application.log")]
    public string LogFile { get; set; }
}

需要将默认值改为运行时计算的动态路径(比如当前用户的临时文件夹),同时让内置帮助文本显示实际的默认值,而非静态字符串。

解决方案

方法一:自定义描述提供器(兼容全版本)

1. 移除静态默认值特性,运行时初始化默认值

先去掉[DefaultValue]特性,在配置类的构造函数或Validate方法中设置动态默认值:

public class LogCommandSettings : CommandSettings
{
    [CommandOption("--logFile")]
    [Description("Path and file name for logging (default: {0})")] // 预留占位符
    public string LogFile { get; set; }

    public LogCommandSettings()
    {
        // 运行时生成临时路径下的日志文件
        LogFile = Path.Combine(Path.GetTempPath(), "application.log");
    }

    // 可选:如果需要在参数校验阶段补全默认值
    public override ValidationResult Validate()
    {
        if (string.IsNullOrWhiteSpace(LogFile))
        {
            LogFile = Path.Combine(Path.GetTempPath(), "application.log");
        }
        return base.Validate();
    }
}

2. 实现自定义描述提供器替换占位符

创建一个IDescriptionProvider的实现,动态将描述中的占位符替换为实际默认值:

public class RuntimeDefaultValueDescriptionProvider : IDescriptionProvider
{
    public string GetDescription(CommandOption option, ICommandSettings settings)
    {
        var originalDesc = option.Description;
        if (settings is LogCommandSettings logSettings 
            && option.Property.Name == nameof(LogCommandSettings.LogFile))
        {
            return string.Format(originalDesc, logSettings.LogFile);
        }
        return originalDesc;
    }

    public string GetDescription(CommandArgument argument, ICommandSettings settings)
    {
        return argument.Description;
    }
}

3. 注册自定义描述提供器

在命令应用配置中添加这个提供器:

var app = new CommandApp<LogCommand>();
app.Configure(config =>
{
    config.SetDescriptionProvider(new RuntimeDefaultValueDescriptionProvider());
    // 其他命令配置逻辑
});

await app.RunAsync(args);

方法二:使用DefaultValueFactory(仅支持Spectre.Console v0.46+)

如果使用的是较新版本的框架,可以直接通过DefaultValueFactory参数指定动态默认值,框架会自动在帮助中显示实际值:

public class LogCommandSettings : CommandSettings
{
    [CommandOption("--logFile", DefaultValueFactory = typeof(LogFileDefaultFactory))]
    [Description("Path and file name for logging")]
    public string LogFile { get; set; }
}

// 实现默认值工厂
public class LogFileDefaultFactory : IDefaultValueFactory
{
    public object Create(CommandOption option, ICommandSettings settings)
    {
        return Path.Combine(Path.GetTempPath(), "application.log");
    }
}

这种方式无需额外处理帮助文本,框架会自动将工厂生成的默认值注入到帮助信息中。

内容的提问来源于stack exchange,提问作者g.pickardou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:57:40