一、程序的基本结构
程序的控制核心是Context类,它持有:
·类型管理器TypeManager,管理该运用程序域加载的命名空间及类型的树,树结构如下:
TypeDictionary(Root)
|--TypeDictionary
| |--TypeDictionary
| |--TypeDictionary
| |

| |--Type
| |--Type
| |

|
|--TypeDictionary
|

|--Type
|--Type
|


其中TypeDictionary对应的是命名空间,Type对应的是类型。TypeManager还管理一个名为Now的TypeDictionary,表示当前所在的 TypeDictionary。
·AliasCmds ,命令缩写字典。
·Instances,用户变量字典。
·CmdDispatcher是命令指派器。控制台获取指令后传给Context。代码:
while ((cmd = Console.ReadLine().Trim()) != "exit")

{
if (!String.IsNullOrEmpty(cmd))

{
cxt.Invoke(cmd);
}
Console.Write(">> ");
}

Context又传给CmdDispatcher处理。CmdDispatcher解析命令,根据命令的特征选择不同的CmdHandler来处理。目前编写了5个CmdDispatcher:
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 == 0) return;

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;
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义