命令行分析组件IKende.CLI

        IKende.CLI是一款开源的命令行分解组件,它可以简地把命令行字符转换成命令对象。在编写CLI应用的时候经常要对命令字符进行繁锁的分解和转换工作,而IKende.CLI的存也是为了解决以上问题而产生;通过特性的描述来简化命令分析工作,从而让在编写CLI的时候制定命令变得更方便简单。下面简单地讲解组件的使用

组件结构

     在使用前先了解一下组件的结构

        Parse是组件的切入点,也是使用的主要对象。他依据两个对象来对数据进行分析处理分别是ILineAnalyzer和CommandBuilder.

ILineAnalyzer

        接口主要描述对命令行字符进行分析并返回一个统一的数据结构,组件提供一个默认实现;由于使用习惯的问题也可以制其他命令分解方式。

CommandBuilder 

        对象的主要作用是根据ILineAnalyzer结构绑定到对象中,通过CommandAttribute和ArgumentAttribute两个特性来描述对象及其属性和命令字符的对应关系。整个组件的设计都比较简单,还有两个接口ICommand和IConvert就不作详细介绍了分别的命令定义规则和参数转换规则的定义。

定义命令对象

        组件默认分析器命令属性是以[-字母]来描述一个命令属性,然后空格跟随就是属性的内容如:

login -h host -p port -u userName -w password

        以上是一个简单地登陆指令,分别有主机名,端口,用户名和密码等信息。针对以上字符命令制定的命令对象如下:

[Command("login")]
    public class Login : CommandBase
    {
        [Argument("h", "-h Host", Regex = @"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]).)+([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$")]
        public string Host
        {
            get;
            set;
        }
        [Argument("p", "-p Port", DefaultValue = "8088", Regex = @"^d{4,5}$")]
        public int Port
        {
            get;
            set;
        }
        [Argument("u", "-u userName")]
        public string UserName
        {
            get;
            set;
        }
        [Argument("w", "-w passWord")]
        public string Pwd
        {
            get;
            set;
        }
    }

        由于有些属性的数据是规范的,所以可以通过Argument特性的Regex属性来制定一个数据约束规范;特性同样也提供DefaultValue来描述一个属性的默认值,如果在编写命令时没有指定该属性值则使用默认值。

使用

命令定义好后只需要使用Parse对象对输入的字符命令分析即可。

Parse<LineAnalyzer> mParse = new Parse<LineAnalyzer>();
mParse.LoadAssembly(typeof(Login).Assembly);//or mParse.Load<Login>();
string line="login -h www.ikende.com -u henry -w 123456";
ParseResult presult = mParse.Execute(line);
if (string.IsNullOrEmpty(presult.Error))
{
    //presult.Command
}

        在定义Parse对象的时候而要指定LineAnalyzer分析器,分析器类型的指定则根据实际应用的需求。Parse定义完成后需要加载相应的命令信息,类提供了两个方法Load和LoadAssembly分别用于加载单个对象或某程序集下面的所有命令对象。最后通过执行Execute方法得到具体ParseRresult对象,在分析过程有可能存在逻辑上的错误,通过ParseResult.Error属性可以得到具体逻辑错误信息。

应用效果

组件项目地址

         https://github.com/IKende/IKendeCLI

原文地址:https://www.cnblogs.com/smark/p/3546203.html