最近项目里面涉及和低层通信的一个模块,因为需要定义通信协议,然后一大堆指令,定义一个枚举的话就能看到几十上百的数据项,匹配操作的时候,那么问题来了,尼玛,这么多的case看着就头晕,就有了一个想法:怎么想办法把这长长的case列表给砍掉。

咨询了几个技术好友,结果都不怎么如意。有个哥们跟我说,可以考虑使用反射,我开始有点蒙,后来他说是通过枚举字串反射为类实例再进行处理就好了。然后我确实明白了,但是,为了一个case表就要为何那么多类么?瞬间整个人都不好了。

自己想了想,忽然想到了MFC里面有个消息映射,不就是用来处理消息和消息处理函数的关系的么?而且那就是一个超级长的case列表。既然有想法了就去试了试,因为基础不够好,在使用委托的时候,把事件和委托的关系弄的不清不楚的,而且在给消息映射的结构类的委托成员赋值的时候提示说必须使用静态成员,蒙了半天,最后还是克服了里面的困难,搞定了,代码如下:

   public enum Commands
{
One = ,
Two,
Three
}
  public class MessageMapping
{
public Commands Command { get; set; }
public Action<byte[], object> Func { get; set; }
}
  public class DemoTest
{ private int Value = ; public void Execute(Commands command,object obj)
{
foreach (MessageMapping item in MessageMap)
{
if (item.Command == command)
{
item.Func(new byte[],obj);
}
}
} private MessageMapping[] MessageMap = new MessageMapping[] {
new MessageMapping(){Command = Commands.One,Func = CommandDemo}}; private static void CommandDemo(byte[] datas, object obj)
{
DemoTest model = obj as DemoTest;
model.Value = ;
Console.WriteLine(model.Value);
}
};

然后是测试用的客户端代码:

  static void Main(string[] args)
{
DemoTest demo = new DemoTest();
demo.Execute(Commands.One, demo);
Console.ReadKey();
}

结果是:

这样一来,只需要在类里面维护一个消息映射结构的数组,然后添加相应的处理函数就可以了。增减数据项,对应的修改数组里面的数组元素就可以了。没有了那超长的恶心的case列表,代码也舒爽了很多。

人比较菜,欢迎大家拍砖

关于消除超长的case列表的一个思路的更多相关文章

  1. 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    新服务器安装完开发环境后,还需要注册framework4.0到IIS.不然会报错:   HTTP 错误 500.21 - Internal Server Error 处理程序“Extensionles ...

  2. HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipe ...

  3. 【ASP.NET 问题】IIS发布网站后出现 "处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误"的解决办法

    新装IIS,然后发布网站,运行出现如下错误提示 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 于是 ...

  4. asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” http:// ...

  5. [转]处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    今天安装了windows7 开发web项目需要安装IIS,当安装完以后,web程序已经映射到了本地IIS上,运行出现如下错误提示 处理程序“PageHandlerFactory-Integrated” ...

  6. 处理程序“WebServiceHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    开发web项目时需要安装IIS,在安装好IIS的Windows7本上发布asp.net网站时,web程序已经映射到了本地IIS上,但运行如下错误提示“处理程序“PageHandlerFactory-I ...

  7. 【转】asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    原文:http://blog.csdn.net/mazhaojuan/article/details/7660657 开发web项目时需要安装IIS,在安装好IIS的Windows7本上发布asp.n ...

  8. [改善Java代码]子列表只是原列表的一个视图

    List接口提供了subList方法,其作用是返回一个列表的子列表.这与String类的subString有点类似.但是他们的功能是否相同?看代码: import java.util.ArrayLis ...

  9. HTTP 错误 500.21 - Internal Server Error处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    HTTP 错误 500.21 - Internal Server Error处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipel ...

随机推荐

  1. BZOJ1407_NOI2002_荒岛野人_Savage_C++

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1407 题解:http://www.cnblogs.com/hadilo/p/5951091.h ...

  2. Testlink中分析结果的图表显示乱码

    1.下载 tahoma.ttf 字体: 2.下载好后,我们将其放置到,testlink的安装目录的以下文件夹中: testlink/third_party/pchart/Fonts/ 接下来,修改配置 ...

  3. 初探接口测试框架--python系列3

    点击标题下「微信」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期 ...

  4. 反向生成hbm.xml

    选择数据库透视图 打开数据连接 打开刚刚创建的连接,然后打开用户名下的表 这个就是she用户下的表,我们选中要反向生成的表,可以多选,然后点击右键 点击Hibernate Reverse Engine ...

  5. nearly,about,almost的区别

    nearly 几乎,将近almost 几乎,差一点儿就,差不多(与动词,副词,形容词以及名词连用时,可与nearly通用;与no,none,nothing,never等否定式连用时,不可与nearly ...

  6. EF调用存储过程遇到的问题

    注意 实体类Statistics的字段名和存储过程返回集合的列名要相同才行

  7. EF,ADO.NET Entity Data Model简要的笔记

    1. 新建一个项目,添加一个ADO.NET Entity Data Model的文件,此文件会生成所有的数据对象模型,如果是用vs2012生的话,在.Designer.cs里会出现“// Defaul ...

  8. 注册码 myeclipse6.5-6.8

    package controllersli; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...

  9. 问 如何使用css将select的边框以及右边的小三角形去掉?

    最好css2,css3都给出解决方案,效果如下: CSS2 只能使用div和ul进行模拟了,结构很简单,具体可参考Alice的 button-dropdownCSS3 可以使用CSS3的属性appea ...

  10. hdu2085

    #include <stdio.h> int main(){ __int64 h[],l[]; int i,j; int n; ){ h[]=; l[]=; ;i<=n;++i){ ...