System.CommandLine参数Argument

前两篇说到Command和Option,这篇说说Argument。Argument的用法和Option很像,只是他的构造和属性有些差别,再就是在运行输入时有区别,接下来看看实现。

一个参数

//创建根命令
var rootCommand = new RootCommand("这是一个命令行工具:旦猫");
rootCommand.SetHandler(() =>
{
    Console.WriteLine("欢迎使用《旦猫》");
});
//创建子命令 show
var showCommand = new Command("show", "显示一些信息");
//创建参数 color
var showArgument = new Argument<string>(name: "color", description: "设置输出信息的色彩")
{
    //这里设置只有一个color参数
    Arity = ArgumentArity.ExactlyOne,
};
//添加参数到show命令中
showCommand.AddArgument(showArgument);
//设置命令show执行的动作,这是带上color参数,类型为string
showCommand.SetHandler((string color) =>
{
    Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), color,true);
    Console.WriteLine($"这是《旦猫》的show命令");
    Console.ResetColor();      
}, showArgument);
//添加命令show到 根命令中
rootCommand.Add(showCommand);
await rootCommand.InvokeAsync(args);

运行结果:

4a98c66084ddc8ae582d80f4b1c28725.png

二个参数

如果当有多个参数时:

//创建根命令
var rootCommand = new RootCommand("这是一个命令行工具:旦猫");
rootCommand.SetHandler(() =>
{
    Console.WriteLine("欢迎使用《旦猫》");
});
//创建子命令 show
var showCommand = new Command("show", "显示一些信息");


//创建参数 color
var colorArgument = new Argument<string>(name: "color", description: "设置输出信息的色彩")
{
    //这里设置只有一个color参数
    Arity = ArgumentArity.ExactlyOne,
};
//创建参数 times
var timesArgument = new Argument<int>(name: "times", description: "设置输出的次数")
{
    //这里设置只有一个times参数
    Arity = ArgumentArity.ExactlyOne,
};
//添加参数到show命令中
showCommand.AddArgument(colorArgument);
showCommand.AddArgument(timesArgument);
//设置命令show执行的动作,这是带上color参数,类型为string
showCommand.SetHandler((string color, int times) =>
{
    for (var i = 1; i <= times; i++)
    {
        Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), color, true);
        Console.WriteLine($"这是《旦猫》的show命令");
    }
    Console.ResetColor();
}, colorArgument, timesArgument);
//添加命令show到 根命令中
rootCommand.Add(showCommand);
await rootCommand.InvokeAsync(args);

运行结果:

4e29127013ebeea9465e2db59b62eec2.png

参数输入值类型转换

在第一个例子的SetHandler中,我们做了string到ConsoleColor的类型转换,其实这里可以通过参数自带的构造函数参数parse来实现类型转换。代码如下:

//创建根命令
var rootCommand = new RootCommand("这是一个命令行工具:旦猫");
rootCommand.SetHandler(() =>
{
    Console.WriteLine("欢迎使用《旦猫》");
});
//创建子命令 show
var showCommand = new Command("show", "显示一些信息");


//创建参数 color
var showArgument = new Argument<ConsoleColor>(name: "color", description: "设置输出信息的色彩", parse: ParseColor<ConsoleColor>)
{
    Arity = ArgumentArity.ExactlyOne,
};
//类型转换内置方法
ConsoleColor ParseColor<ConsoleColor>(ArgumentResult result)
{
    var color = result.Tokens[0].Value;
    return (ConsoleColor)Enum.Parse(typeof(ConsoleColor), color.ToString(), true);
}
//添加参数到show命令中
showCommand.AddArgument(showArgument);
//设置命令show执行的动作,这是带上times参数,类型为ConsoleColor
showCommand.SetHandler((ConsoleColor color) =>
{
    Console.ForegroundColor = color;
    Console.WriteLine($"这是《旦猫》的show命令");
    Console.ResetColor();
}, showArgument);
//添加命令show到 根命令中
rootCommand.Add(showCommand);
await rootCommand.InvokeAsync(args);

结果如下:

9b0b6d5a4552bf8d710eb8c148e1a523.png

一个参数多个值


当一个参数多个值的时候,实现方式如下:

//创建根命令
var rootCommand = new RootCommand("这是一个命令行工具:旦猫");
rootCommand.SetHandler(() =>
{
    Console.WriteLine("欢迎使用《旦猫》");
});
//创建子命令 show
var showCommand = new Command("show", "显示一些信息");
//创建参数 color
var showArgument = new Argument<ConsoleColor[]>(name: "color", description: "设置输出信息的色彩", parse: ParseColor<ConsoleColor>)
{
    Arity = ArgumentArity.OneOrMore,
};
//类型转换内置方法
ConsoleColor[] ParseColor<ConsoleColor>(ArgumentResult result)
{
    var colors = new List<ConsoleColor>();
    foreach (var color in result.Tokens)
    {
        colors.Add((ConsoleColor)Enum.Parse(typeof(ConsoleColor), color.Value.ToString(), true));
    }
    return colors.ToArray();
}


//添加参数到show命令中
showCommand.AddArgument(showArgument);
//设置命令show执行的动作,这是带上times参数,类型为ConsoleColor数组
showCommand.SetHandler((ConsoleColor[] colors) =>
{
    foreach (var color in colors)
    {
        Console.ForegroundColor = color;
        Console.WriteLine($"这是《旦猫》的show命令");
        Console.ResetColor();
    }
}, showArgument);
//添加命令show到 根命令中
rootCommand.Add(showCommand);
await rootCommand.InvokeAsync(args);

结果:

fe0c4556e476eae036b02d9e410bdb20.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值