问题描述
类似下面的代码switch(action){case"A":{FunctionA(caseCollections,outmsg);break;}case"B":{FunctionB(caseCollections.data,outmsg);break;}……default:{break;}}根据需要case分支越来越多,请假各位大神有没有什么方式能代替switch呢
解决方案
本帖最后由 superlj06 于 2014-07-31 11:26:21 编辑
解决方案二:
枚举+动态执行
解决方案三:
反射,通过函数名去找函数,然后调用.
解决方案四:
引用1楼diaodiaop的回复:
枚举+动态执行
1楼能说的具体点么刚接触C#不久,谢谢
解决方案五:
stringfun="FunctionA";varparameters=newobject[]{DateTime.Now,""};GetType().GetMethod(fun).Invoke(this,parameters);stringmsg=(string)parameters[1];
推荐反射
解决方案六:
多了就应该上配置文件啊
解决方案七:
用委托。直接将方法作为参数传进来,不需要传“action”
解决方案八:
我觉得这个时候就是设计模式的使用了,你可以使用工厂方法模式,或者命令模式,将case的内容分离出来就可以了。
解决方案九:
用IF替换就是最简单的
解决方案十:
dic<string,委托>varfun=dic.First(x=>x.Key=="").Value;fun(caseCollections,outmsg)
解决方案十一:
三元运算符true?funA:funB
解决方案十二:
委托可以,用Dictionary来Key就是你原先的case,value就是具体的方法
解决方案十三:
引用7楼dongdongdongJL的回复:
我觉得这个时候就是设计模式的使用了,你可以使用工厂方法模式,或者命令模式,将case的内容分离出来就可以了。
工厂模式不行吧。工厂模式内部也是使用switch进行实例化对象的,只是把由客户选择转移到由工厂选择而已。改进的抽象工厂模式也并没有解决这个问题。真正要解决这个问题,应该是反射和委托。
解决方案十四:
定义一个委托把你的判定依据写成条件代码再用起来就简单了