前兩篇說到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);
運行結果:
二個參數
如果當有多個參數時:
//創建根命令
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);
運行結果:
參數輸入值類型轉換
在第一個例子的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);
結果如下:
一個參數多個值
當一個參數多個值的時候,實現方式如下:
//創建根命令
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);
結果: