最近项目里面涉及和低层通信的一个模块,因为需要定义通信协议,然后一大堆指令,定义一个枚举的话就能看到几十上百的数据项,匹配操作的时候,那么问题来了,尼玛,这么多的case看着就头晕,就有了一个想法:怎么想办法把这长长的case列表给砍掉。
咨询了几个技术好友,结果都不怎么如意。有个哥们跟我说,可以考虑使用反射,我开始有点蒙,后来他说是通过枚举字串反射为类实例再进行处理就好了。然后我确实明白了,但是,为了一个case表就要为何那么多类么?瞬间整个人都不好了。
自己想了想,忽然想到了MFC里面有个消息映射,不就是用来处理消息和消息处理函数的关系的么?而且那就是一个超级长的case列表。既然有想法了就去试了试,因为基础不够好,在使用委托的时候,把事件和委托的关系弄的不清不楚的,而且在给消息映射的结构类的委托成员赋值的时候提示说必须使用静态成员,蒙了半天,最后还是克服了里面的困难,搞定了,代码如下:
1 public enum Commands 2 { 3 One = 0, 4 Two, 5 Three 6 }
1 public class MessageMapping 2 { 3 public Commands Command { get; set; } 4 public Action<byte[], object> Func { get; set; } 5 }
1 public class DemoTest 2 { 3 4 private int Value = 0; 5 6 public void Execute(Commands command,object obj) 7 { 8 foreach (MessageMapping item in MessageMap) 9 { 10 if (item.Command == command) 11 { 12 item.Func(new byte[1],obj); 13 } 14 } 15 } 16 17 private MessageMapping[] MessageMap = new MessageMapping[] { 18 new MessageMapping(){Command = Commands.One,Func = CommandDemo}}; 19 20 private static void CommandDemo(byte[] datas, object obj) 21 { 22 DemoTest model = obj as DemoTest; 23 model.Value = 20; 24 Console.WriteLine(model.Value); 25 } 26 };
然后是测试用的客户端代码:
1 static void Main(string[] args) 2 { 3 DemoTest demo = new DemoTest(); 4 demo.Execute(Commands.One, demo); 5 Console.ReadKey(); 6 }
结果是:
这样一来,只需要在类里面维护一个消息映射结构的数组,然后添加相应的处理函数就可以了。增减数据项,对应的修改数组里面的数组元素就可以了。没有了那超长的恶心的case列表,代码也舒爽了很多。
人比较菜,欢迎大家拍砖