笔者的上一片文章中用了四种方式来实现CAD命令系统的功能,也提到了各自的优缺点,也提出了自己的观点,使用第四种方式能获得非常好的扩展性体验。然而,仔细观察一下代码,读者会发现,第四种实现方法是通过三层循环(第一层循环是为了连续读取用户输入的命令。),将用户输入的命令与方法的特性值一个一个做比对而实现的。也就是说,在用户输入完命令后,程序就开始遍历方法数组,然后获得某个方法的特性,然后再遍历这个方法的特性,并将特性值与用户输入的命令做比较。

如果方法的数量不多,且方法的特性性比较少时,这么做不会有太大的问题。但是对于一个CAD系统,被调用的方法有上千个,而每个方法又有多个不同的命令。那么要查找到需要的命令,可能就需要循环上万次。这绝对是件耗费时间、考验机器性能的事情。那么有什么方法能更好的解决这个问题呢?

在上一篇文章中笔者提到过字典类。字典类的运算速度非常快,因为他使用了散列算法,可以在微秒级别上迅速找出给定的键的值。既然它的速度这么快,有没有办法把反射和字典这两种方法结合起来呢?

答案是肯定的,关键点就在MehodInfo类!

在上一篇文章中,笔者提到了反射和特性中有一个MethodInfo的类。这个类在反射中是表示方法的元数据,说的通俗点,它就表示一个方法,只不过这个被表示的方法只能通过MethodInfo类的Invoke方法被调用。既然MehodInfo的对象代表的是方法,那么我们就可以定义一个“命令—方法”键值关系,并保存在字典类中。用“命令”做为“键”,用“方法”作为值。

ok,下面来看代码。由于在这个程序中,我们需要考虑扩展以及多命令,所以还是要使用“特性”和“反射”等技术。

首先,定义一个特性类和命令类,并在命令类中的方法上使用特性。

    /// <summary>/// 用于反射的特性/// </summary>class CMDAttribute : System.Attribute{string[] cmd;public string[] Cmd{get { return cmd; }}public CMDAttribute(params string[] cmd){this.cmd = cmd;}}/// <summary>/// 这是个命令类,供用户调用/// </summary>static class Commander{[CMD("s","sh","h","hi")]static public int SayHi(){Console.WriteLine("Hello girl. How beautifull you are!");return 0;}[CMD("i","ip","ipad")]static public int Ipad(){Console.WriteLine("yes i have a Ipad!");return 0;}}

注意:Commander类的定义中使用了static关键字,主要是为了本例的方便。因为如果不使用static关键字,那么在使用这个类的时候,还必须先创建对象。


现在我们再定义一个类,让这个类的对象被创建的时候,自动加载保存“命令—方法”的字典。代码如下:

   class InitilizeCmd{Dictionary<string, MethodInfo> cmd;public Dictionary<string, MethodInfo> Cmd{get { return cmd; }}public void InitilizeCmd(){CMDAttribute Attri;Type TPC = typeof(Commander);Type TPA = typeof(CMDAttribute);MethodInfo[] meths = TPC.GetMethods();//遍历方法数组,获取每个方法的特性,然后将方法的特性与用户输入的命令比较。如果用户输入的命令与特性一致,就执行这个特性所表示的方法,如果不一致,就告诉用户命令有错。foreach (MethodInfo M in meths){//判断方法是否应用了TCmdAttribute所抽象的特性。并且不向上查找继承的类。  //这一句非常重要。因为Type的GetMethods()方法会获取类的所有方法,包括他所继承的基类的方法。  //而基类的方法是没有使用我们自定义的特性,那么在进行下一句,对attr赋值是,attr会是一个空。  //所有我们使用MethodInfo对象的IsDefined()方法来确定某个方法使用了某个自定义的特性。  if (M.IsDefined(TPA, false)){//获取方法的特性。  Attri = (CMDAttribute)M.GetCustomAttribute(TPA, false);//将方法的特性和方法名作为一个键—值关系存入Dictionary<string, int>字典中。foreach (string commad in Attri.Cmd){cmd.Add(commad, M);}}}}}

到目前为止,我们的命令类有了,利用特性和反射将“命令(特性值)”和“方法”保持至字典的类也有了。现在要使用这个类,只需要创建InitilizeCmd类的对象就可以了。

那么在程序的Main()函数中我们就可以这样写了:

        static void Main(string[] args){//创建InitilizeCmd类的对象,并初始化。InitilizeCmd INCMD = new InitilizeCmd();//创建MethodInfo对象MethodInfo M;do{Console.WriteLine("请输入命令...");string InputCMD = Console.ReadLine().ToLower();try{M = INCMD.Cmd[InputCMD];M.Invoke(null, null);}catch (Exception e){Console.WriteLine("命令输入有误,请重新输入\n"+e.Message);}} while (true);}

在Main()函数中使用try……catch结构是因为如果用户输入的命令不正确,会导出无法查找字典中键—值,使得程序出错。

此致,将“字典”与“特性”、“反射”相结合的方法就介绍完了。这样做的好处显而易见,只在加载程序时利用反射遍历一次方法数组,而无需在输入命令时一遍又一遍的遍历数组。这样既保证了程序的扩展性,也保证了大大提高了程序运行的性能。

关于CAD命令系统的改进相关推荐

  1. 如何实现类似CAD的命令系统

    本文系个人原创,如转载,请标明出处.由于个人技术有限,如有错误,欢迎大家指出. 如果大家使用了AutoCAD,那么大家就一定知道CAD的命令.在CAD中,命令可以是任意的大小写,也可以是被调用方法的全 ...

  2. SolidWorks2021安装包下载SolidWorks2021安装教程

    软件介绍: SolidWorks2021是一款非常实用的具有大型大型3D机械建模功能的机械制图和绘图软件,为您操作所有的制作方案,概念设计.曲面造型.2 D工程图.逆向工程.自动化等都不在话下,帮助您 ...

  3. 浅析中国服装销售软件的发展之路

    经济的全球化,给服装企业带来无限商机,同时也给服装企业的生产制造带来越来越大的压力.许多企业通过采用新技术,引进服装CAD技术来改进生产工艺,提 高产品质量:采用电子商务系统,进行网上营销,获得市场信 ...

  4. CAD功能库CAD DLL v15 2023最新上线!改进3D格式文件

    CAD DLL是一个为开发者打造的新版本CAD库,可在支持动态链接库技术的语言中添加CAD功能到应用程序中. 很高兴与大家分享,CAD Dll迎来了久违的更新,更新至v15,3D改进,还改进了 DWG ...

  5. 大型CAx(CAD/CAE/CAM)工业软件开发中的关键组件

    通过对FreeCAD.SALOME等多款代码的分析研究,发现这些软件在架构设计.模块实现等方面,存在许多相似(同)的技术思想.因此,有必要对这些共性.主流的技术予以总结分析. Structuring ...

  6. 人工智能改进传统云ERP的10种方法

    http://blog.itpub.net/31542119/viewspace-2168809/ 随着数字化转型的进程加快,企业开始重新评估ERP的作用.传统ERP经过多年僵硬化定制过于追求生产的一 ...

  7. 理正地基基础计算机辅助设计的英文缩写,理正基础CAD软件介绍理正基础CAD软件介绍.pdf...

    理正基础CAD软件介绍理正基础CAD软件介绍 理正基础CAD 软件介绍 北京理正软件设计研究院 华中.华北地区:万涛 联 系 方 式:010 手 机 传 真:010 电 子 信 箱:lizhengwa ...

  8. cad幕墙下料lisp_石材幕墙屋面不锈钢角钢接闪带施工方法

    石材幕墙屋面不锈钢角钢接闪带施工方法  摘要:石材幕墙屋面接闪带传统安装方法采用镀锌圆钢.不锈钢管明敷或加接闪小针等防雷方式,安装后易产生变形.幕墙漏水等问题,锈蚀会污染石材表面,影响建筑立面效果,清 ...

  9. 高职计算机专业用什么软件,【计算机专业论文】高职计算机专业CAD软件教学思考(共4772字)...

    [摘要]作为功能强大实用性强的CAD软件,在高职计算机专业的教学中应有较高的地位.高职计算机专业教学,使学生能掌握并熟练运用CAD软件,要求我们在高职计算机专业CAD教学中不断创新,改变当前CAD软件 ...

最新文章

  1. 人工智能的发展,需要遵守的四个AI伦理原则
  2. oa 中会议推送 实现_诗尼曼:大OA+费控赋能千店一体,打造家居数字化标杆
  3. php 现货 结算算法,PHP算法逻辑:如何计算购买量?
  4. 从Tensorflow代码中理解LSTM网络
  5. Exp1 PC平台逆向破解 20164309 欧阳彧骁
  6. 学校门口的树C语言算法,C语言校园导游程序设计汇报.doc
  7. pycharm中配置r语言_【R语言】R语言中的循环
  8. SpringBoot2.0 基础案例(02):配置Log4j2,实现不同环境日志打印
  9. 【FLink】Flink checkpoint 实现数据连续计算 恢复机制 案例实战
  10. android6.0/7.0禁掉Selinux
  11. C# 读写锁 ReaderWriteLock
  12. 卡尔曼滤波原理介绍及算法实现
  13. Unity集成Bugly踩坑
  14. Java爬取彼岸桌面壁纸的实现(使用Jsoup)
  15. matlab 更换坐标轴_科学网—【Matlab】坐标轴的设置 - 叶瑞杰的博文
  16. 农夫过河问题(一个有趣的问题-位运算)
  17. java office 集成开发_[转载]Java集成PageOffice在线打开编辑word文件 - Spring Boot
  18. PPT2016制作一个封面页实例教程
  19. springboot线程中获取bean
  20. 深入浅出讲解自动驾驶 - 自动驾驶系统构成

热门文章

  1. [2021.12.12]<UE4学习日记>制作炮塔
  2. 对比Excel,轻松学习 Python 报表自动化实战!
  3. 微信小程序-tempfilePath文件的上传问题
  4. SMT贴片打样中常出现“立碑”的原因有哪些?
  5. js批量操作html标签,js setattribute批量设置css样式的方法
  6. 国外较知名的无线传感器网络技术研究公司
  7. 【力扣刷题 | 第十二天】
  8. 教育大国芬兰儿童编程作家讲述“编程思维”
  9. 必备技能13:如何白嫖Scribd上的pdf文件
  10. 三级联动地区选择插件