IKende.CLI是C#的命令行分析组件,可以很方便地将命令行参数解析成对象或字典,支持多种参数类型以及自定义参数类型。下面将介绍IKende.CLI的详细使用方法、案例说明以及最佳实践。
一、安装
将IKende.CLI下载到本地,然后通过NuGet安装IKende.CLI库。
二、基本用法
使用IKende.CLI非常简单,只需要在Main方法中调用CommandLine.Parse方法即可:
``` csharp
using IKende.CLI;
class Program
{
static void Main(string[] args)
{
var cli = CommandLine.Parse(args);
}
}
```
CommandLine.Parse方法将会解析args参数,并返回一个CommandLine对象,CommandLine对象包含了所有的参数。可以通过如下代码获取CommandLine对象中的参数:
``` csharp
foreach (var option in cli.Options)
{
Console.WriteLine("{0}={1}", option.Key, option.Value);
}
```
在命令行中,参数需要以“--key value”的形式出现。例如,下面的命令行参数用于表示程序运行时需要输出log。
```
--log true
```
那么在代码中就可以这样获取参数。
``` csharp
bool log = cli.Options["log"] == "true";
```
三、参数类型
IKende.CLI支持多种类型的参数,如下。
- string:字符串类型
- bool:布尔类型,例如--log=true或--log
- int:整数类型,例如--port=80
- double:浮点数类型,例如--ratio=0.85
- enum:枚举类型,例如--level=High
- array:数组类型,例如--ids=1,2,3
- custom:自定义类型,例如--email-address=example@qq.com
四、参数转换
1. string类型参数
如果不指定类型,CommandLine.Parse将会默认把参数解析成字符串类型。
``` csharp
CommandLine.Parse(new string[] { "--path", "D:\\work" });
```
2. bool类型参数
如果指定了布尔类型,那么CommandLine.Parse将会自动把参数解析成布尔类型。
``` csharp
CommandLine.Parse(new string[] { "--log", "true" });
```
3. int类型参数
如果指定了整数类型,那么CommandLine.Parse将会自动把参数解析成整数类型。
``` csharp
CommandLine.Parse(new string[] { "--port", "8080" });
```
4. double类型参数
如果指定了浮点数类型,那么CommandLine.Parse将会自动把参数解析成浮点数类型。
``` csharp
CommandLine.Parse(new string[] { "--ratio", "0.85" });
```
5. enum类型参数
如果指定了枚举类型,那么CommandLine.Parse将会自动把参数解析成枚举类型。
``` csharp
enum Level
{
Low,
Medium,
High
}
CommandLine.Parse(new string[] { "--level", "High" });
```
6. array类型参数
如果指定了数组类型,那么CommandLine.Parse将会自动把参数解析成数组类型。
``` csharp
CommandLine.Parse(new string[] { "--ids", "1,2,3" });
```
7. custom类型参数
如果需要解析自定义的参数类型,需要实现IDictionary ``` csharp class EmailAddress : IDictionary { private string _address; public EmailAddress(string address) { _address = address; } public string this[string key] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public ICollection public ICollection public int Count => throw new NotImplementedException(); public bool IsReadOnly => throw new NotImplementedException(); public void Add(string key, string value) { throw new NotImplementedException(); } public void Add(KeyValuePair { throw new NotImplementedException(); } public void Clear() { throw new NotImplementedException(); } public bool Contains(KeyValuePair { throw new NotImplementedException(); } public bool ContainsKey(string key) { throw new NotImplementedException(); } public void CopyTo(KeyValuePair { throw new NotImplementedException(); } public IEnumerator { throw new NotImplementedException(); } public bool Remove(string key) { throw new NotImplementedException(); } public bool Remove(KeyValuePair { throw new NotImplementedException(); } public bool TryGetValue(string key, out string value) { if(key == "address") { value = _address; return true; } value = null; return false; } IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } } CommandLine.Parse(new string[] { "--email-address", "example@qq.com" }); ``` 五、案例说明 1. 解析命令行参数 在Cmd中使用: ``` dotnet c:\DotNetCore\ConsoleAppExample.dll file.txt 60 -v ``` 在程序中解析命令行参数: ``` csharp class Options { [Option("file", Required = true)] public string FileName { get; set; } [Option("timeout")] public int Timeout { get; set; } = 30; [Option('v')] public bool Verbose { get; set; } } static void Main(string[] args) { var options = CommandLine.Parse Console.WriteLine(options.FileName); Console.WriteLine(options.Timeout); Console.WriteLine(options.Verbose); } ``` 2. 自定义选项类型 在Cmd中使用: ``` dotnet c:\DotNetCore\ConsoleAppExample.dll -file 'D:\work\test.xlsx' -time 60 -type 'my-excel' ``` 在程序中解析命令行参数: ``` csharp class ExcelFileOption : IDictionary { private string _path; private string _type; public ExcelFileOption(string path, string type) { _path = path; _type = type; } public string this[string key] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public ICollection public ICollection public int Count => throw new NotImplementedException(); public bool IsReadOnly => throw new NotImplementedException(); public void Add(string key, string value) { throw new NotImplementedException(); } public void Add(KeyValuePair { throw new NotImplementedException(); } public void Clear() { throw new NotImplementedException(); } public bool Contains(KeyValuePair { throw new NotImplementedException(); } public bool ContainsKey(string key) { throw new NotImplementedException(); } public void CopyTo(KeyValuePair { throw new NotImplementedException(); } public IEnumerator { throw new NotImplementedException(); } public bool Remove(string key) { throw new NotImplementedException(); } public bool Remove(KeyValuePair { throw new NotImplementedException(); } public bool TryGetValue(string key, out string value) { if(key == "path") { value = _path; return true; } if(key == "type") { value = _type; return true; } value = null; return false; } IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } } class Options { [Option("file", Required = true)] public ExcelFileOption FileOption { get; set; } [Option("time")] public int Timeout { get; set; } = 30; } static void Main(string[] args) { var options = CommandLine.Parse Console.WriteLine(options.FileOption["path"]); Console.WriteLine(options.FileOption["type"]); Console.WriteLine(options.Timeout); } ``` 六、最佳实践 在实际开发中,我们建议使用IKende.CLI作为命令行解析组件,使用以下最佳实践来提高开发效率。 1. 将选项定义在一个名为Options的类中,使用OptionAttribute来表示选项。 ``` csharp class Options { [Option("log")] public bool Log { get; set; } [Option("port")] public int Port { get; set; } } ``` 2. 使用CommandLine.Parse方法来解析命令行参数。 ``` csharp var options = CommandLine.Parse(args); ``` 3. 使用CommandLine.Parse ``` csharp var options = CommandLine.Parse ``` 4. 如果需要解析自定义的选项类型,需要实现IDictionary 7. 使用OptionAttribute的Required属性来指定一个必选项。 ``` csharp [Option("file", Required = true)] public string FileName { get; set; } ``` 8. 使用OptionAttribute的DefaultValue属性来指定一个选项的默认值。 ``` csharp [Option("timeout", DefaultValue = 30)] public int Timeout { get; set; } ``` 九、总结 IKende.CLI是C#的命令行分析组件,在命令行开发中非常实用。IKende.CLI支持多种类型的参数,包括字符串、布尔型、整型、浮点型、枚举型、数组型以及自定义型。我们建议将选项定义在一个名为Options的类中,使用OptionAttribute来表示选项。使用CommandLine.Parse
发表评论 取消回复