实现简单的CSharpShell -- OrcShell (1) 基本结构-阿里云开发者社区

开发者社区> 最美的回忆> 正文

实现简单的CSharpShell -- OrcShell (1) 基本结构

简介:
+关注继续查看

一、程序的基本结构




 

程序的控制核心是Context类,它持有:

·类型管理器TypeManager,管理该运用程序域加载的命名空间及类型的树,树结构如下:

     TypeDictionary(Root)
         
|--TypeDictionary
         
|       |--TypeDictionary
         
|       |--TypeDictionary
         
|       |
         
|       |--Type
         
|       |--Type
         
|       |
         
|
         
|--TypeDictionary
         
|
         
|--Type
         
|--Type
         
|

其中TypeDictionary对应的是命名空间,Type对应的是类型。TypeManager还管理一个名为NowTypeDictionary,表示当前所在的TypeDictionary

·AliasCmds ,命令缩写字典。

·Instances,用户变量字典。

·CmdDispatcher是命令指派器。控制台获取指令后传给Context。代码:

            while ((cmd = Console.ReadLine().Trim()) != "exit")
            
{
                
if (!String.IsNullOrEmpty(cmd))
                
{
                    cxt.Invoke(cmd);
                }

                Console.Write(
">> ");
            }

 

Context又传给CmdDispatcher处理。CmdDispatcher解析命令,根据命令的特征选择不同的CmdHandler来处理。目前编写了5CmdDispatcher

CdClassCmdHandler:进出命名空间的处理,针对cdc指令;

ListClassCmdHandler:列出命名空间和类型,针对lsc,dirc指令;

ListInstanceCmdHandler:列出用户变量,针对 my 指令;

ListAliasCmdHandler:列出指令缩写,针对 alias 指令;

CscCmdHandler:编译并运行代码,其它CmdDispatcher 处理不了的都交给它。

CmdDispatcher.Dispatch()方法代码:

 

        public void Dispatch()
        
{
            String[] results 
= InputCmdString.Split(SPLITS, StringSplitOptions.None);
            
if(results.Length == 0return;

            String cmd 
= results[0];
            String mark 
= String.Empty;
            IList
<String> args = new List<String>();

            Int32 argIndex 
= 1;

            
if (results.Length > 1 && results[1].StartsWith("-"))
            
{
                argIndex 
++;
                mark 
= results[1];
            }


            
for(;argIndex < results.Length;argIndex++)
            
{
                args.Add(results[argIndex]);
            }


            
switch (cmd.ToLower())
                
{
                    
case "debug":   // 开启debug开关
                        Context.Debug = true;
                        
break;
                    
case "undebug"// 关闭debug开关
                        Context.Debug = false;
                        
break;
                    
case "cdc":     // 改变命名空间
                        new CdClassCmdHandler(Context, InputCmdString, mark, args).Run();
                        
break;
                    
case "lsc":     // 列出命名空间的内容
                    case "dirc":
                        
new ListClassCmdHandler(Context, InputCmdString, mark, args).Run();
                        
break;
                    
case "my":      // 列出用户变量
                        new ListInstanceCmdHandler(Context, InputCmdString, mark, args).Run();
                        
break;
                    
case "alias":   // 列出alias列表
                        new ListAliasCmdHandler(Context, InputCmdString, mark, args).Run();
                        
break;
                    
default:
                        String fullCmd 
= Context.GetFullCmd(cmd);
                        
if (fullCmd != null)    // 处理 alias
                        {
                            
if (mark != null) fullCmd += " " + mark;
                            
if (args != null && args.Count > 0)
                            
{
                                
foreach(String s in args)
                                
{
                                    fullCmd 
+= " " + s;
                                }

                            }


                            Context.Invoke(fullCmd);
                        }

                        
else                   // 编译代码并运行
                        {
                            
new CscCmdHandler(Context, InputCmdString).Run();
                        }

                        
break;
                }


            
return;
        }

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2008/02/29/1085815.html如需转载请自行联系原作者

xiaotie 集异璧实验室(GEBLAB)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10018 0
使用 NodeJS+Express+MySQL 实现简单的增删改查
关于node.js暂时记录如下,以后有时间一定学习 文章来自简书,作者:sprint,2016-07 使用 Node.js + Express+MySQL 实现简单的增删改查 https://www.jianshu.
2481 0
谷歌百度以图搜图 "感知哈希算法" C#简单实现
/// /// 感知哈希算法 /// public class ImageComparer { /// /// 获取图片的Hashcode /// /// /// public static string GetImageHashCode(string imageName) { int width = 8; int height = 8; // 第一步 // 将图片缩小到8x8的尺寸,总共64个像素。
1617 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13821 0
WAF的简单介绍及实现
WAF的简单介绍及实现
180 0
php系列----->通过PHP数组实现简单的顺序栈
废话少说,上代码(talk is easy,show me the code):
493 0
2286
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载