目录

  • 1、用委托字典代替switch...case;
  • 2、利用反射替代switch...case;
  • 3、比较两种方案
  • 4、其他方案
  • 5、说明
  • 6、参考


在开发 asp.net 项目中,通常使用一般处理程序(ashx)处理前端发送过来的请求,因为一个handler会处理多个请求,故ajax请求中一般都会加一个action的参数,在handler里根据这个action做相应的处理或返回相应的数据,这里大多数人都会想到用switch...case做判断,一开始我也是用的switch,但渐渐地发现,每个case不像一个代码块,不能为其中的变量提供一个独立的作用域!而且,如果case的情况比较多的话,代码看上去也比较臃肿难维护;
那如何替换掉switch...case呢,我想到了如下两个方案:

1、用委托字典代替switch...case;

首先在handler里声明一个私有的静态委托字典,key为action字符串,value为Func委托;然后把action和对应的方法添加到字典中即可;
完整示例代码:

namespace WebApplication1
{public class Handler1 : IHttpHandler{static Dictionary<string, Action<HttpContext>> MapActions = new Dictionary<string, Action<HttpContext>>(StringComparer.OrdinalIgnoreCase){{"Add", Add},{"Sub", Sub}};public void ProcessRequest(HttpContext context){context.Response.ContentType = "text/plain";try{var action = context.Request["Action"];if (string.IsNullOrEmpty(action)){context.Response.StatusCode = (int) HttpStatusCode.BadRequest;}if (MapActions.ContainsKey(action)){var actionFun = MapActions[action];if (actionFun != null){actionFun(context);//或//actionFun.Invoke(context);}else{context.Response.StatusCode = (int) HttpStatusCode.NotImplemented;}}else{context.Response.StatusCode = (int) HttpStatusCode.NotFound;}}catch (Exception e){context.Response.StatusCode = (int) HttpStatusCode.InternalServerError;}finally{context.Response.End();}}public static void Add(HttpContext context){int num1 = int.Parse(context.Request["Num1"]);int num2 = int.Parse(context.Request["Num2"]);int result = num1 + num2;context.Response.Write(result);}public static void Sub(HttpContext context){int num1 = int.Parse(context.Request["Num1"]);int num2 = int.Parse(context.Request["Num2"]);int result = num1 - num2;context.Response.Write(result);}public bool IsReusable{get{return false;}}}
}

2、利用反射替代switch...case;

利用反射,将action的值与具体的方法对应上;
完整示例代码:

namespace WebApplication1
{public class Handler2 : IHttpHandler{static readonly Type[] SearchParamType = new[] { typeof(HttpContext) };public void ProcessRequest(HttpContext context){var result = ActionInvoke(context);context.Response.ContentType = "text/plain";context.Response.Write(result);}private object ActionInvoke(HttpContext ctx){var actionFun = this.GetType().GetMethod("ProcessAction_" + ctx.Request["action"] ?? "",BindingFlags.NonPublic |BindingFlags.IgnoreCase |BindingFlags.Instance |BindingFlags.Public,null,SearchParamType,null);if (null == actionFun){return "UnknowAction";}return actionFun.Invoke(this, new[] { ctx });}public int ProcessAction_Add(HttpContext context){int num1 = int.Parse(context.Request["Num1"]);int num2 = int.Parse(context.Request["Num2"]);int result = num1 + num2;return result;}public int ProcessAction_Sub(HttpContext context){int num1 = int.Parse(context.Request["Num1"]);int num2 = int.Parse(context.Request["Num2"]);int result = num1 - num2;return result;}public bool IsReusable{get{return false;}}}
}

3、比较两种方案

反射会造成一定的性能损耗;所以使用委托字典方案更加靠谱;

4、其他方案

可以使用设计模式实现,比如工厂模式,状态模式,中介模式等,但用在上述这个场景,那么就有杀鸡用牛刀的 感觉了;

5、说明

在简单的逻辑中,case分支少,很少扩展,那么应该用switch语句,因为简单明了,易于阅读。
如果在复杂的逻辑中,复杂而且混乱的case,而且经常扩展什么的,就应该用委托和反射,使用缓存机制。

6、参考

重构:switch语句改成策略模式还是状态模式:https://blog.csdn.net/qq_21381465/article/details/51298808
中介模式: https://www.cnblogs.com/insus/p/4134383.html


转载于:https://www.cnblogs.com/willingtolove/p/11285680.html

asp.net ashx处理程序中switch case的替代方案总结相关推荐

  1. java case switch,Java中Switch Case的替代方案

    Is there any alternative way to implement a switch case in Java other than if else which is not look ...

  2. java break在switch_java中switch case语句需要加入break的原因解析

    java中switch case语句需要加入break的原因解析 java 中使用switch case语句需要加入break 做了具体的实例分析,及编译源码,在源码中分析应该如何使用,大家可以参考下 ...

  3. python中case的用法_python中Switch/Case实现的示例代码

    python 的 python中Switch/Case实现的示例代码 学习Python过程中,发现没有switch-case,过去写C习惯用Switch/Case语句,官方文档说通过if-elif实现 ...

  4. java case switch面试_Java基础篇——Java中switch case语句用法及注意事项面试题9期

    本文主要说一说关于switch case语句用法及注意事项,应对面试官的提问.希望可以帮助那些对switch存在错误和各种细节问题的"码友". switch-case注意事项 sw ...

  5. Matlab中switch, case, otherwise语句

    目录 语法 说明 示例 比较单个值 与多个值进行比较 switch, case, otherwise语句是执行多组语句中的一组. 语法 switch switch_expressioncase cas ...

  6. Kettle中“Switch/case“组件的使用

      "Switch/case"算子的组要作用就是匹配一个字段中的所有值,符合条件的发送给下一个算子,这里以不同班级的学生为例子,以班级做区分分别发送给不同的算子,这里为了方便后续算 ...

  7. MATLAB Simulink中自定义函数和switch case的用法

    文章目录 1 Simulink自定义函数MATLAB Function 2 Simulink中Switch Case模块的用法 1 Simulink自定义函数MATLAB Function 首先写一个 ...

  8. switch case 支持的 6 种数据类型!

    2019独角兽企业重金招聘Python工程师标准>>> 有粉丝建议可以偶尔推送一些 Java 方面的基础知识,一方面可以帮助一初学者,也可以兼顾中高级的开发者. 那么今天就讲一下 J ...

  9. switch case 支持的 6 种数据类型

    转载自  switch case 支持的 6 种数据类型 那么今天就讲一下 Java 中的 switch case 语句吧,有忘记的同学正好可以温习一下. Java 中 switch case 语句用 ...

  10. java switch 类型_Java switch case数据类型原理解析

    这篇文章主要介绍了Java switch case数据类型原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 中 switch cas ...

最新文章

  1. FPGA-YC输出一个4边框
  2. JavaScript使用技巧精萃
  3. gdb 查看 stl容器 zz
  4. PATB1014福尔摩斯的约会
  5. 洛谷 P2347 砝码称重
  6. mysql慢查询开启语句分析_linux下开启mysql慢查询,分析查询语句
  7. 【clickhouse】clickhouse 的 数据类型
  8. 快速清除oracle多个表,Oracle数据库之批量清除一个表的数据,TB级别数据
  9. javajs ---- 判断字符串中是否包含子串
  10. python能做什么项目-适合Python 新手的5大练手项目,你练了么?
  11. 互联网转型需要微服务架构
  12. word转换为pdf后图片失真的解决办法
  13. 有意思的域名Hack网站
  14. Linux安装软件的三种方式
  15. html5选择时间,科技常识:HTML5新控件之日期和时间选择输入的实现代码
  16. 解决在x86平台装openwrt旁路由大流量断网问题(intel网卡驱动bug问题)
  17. C/C++编程:智能指针
  18. 计算机导论课后总结五
  19. Android学习笔记_28_手势识别
  20. latex 单元格 斜杠_如何在Excel中的单元格中启用键入斜杠

热门文章

  1. iOS 开发中 通过AVAssetWriter将录像视频写到指定文件
  2. 快切-开源中文css框架之纯css透明
  3. cisco dce dte
  4. AsteriskNow 实用总结
  5. 计算机应用基础 许晞课程标准,〔计算机应用基础〕课程标准.doc
  6. div 中的i标签如何点击事件_前端优化:语义标签进化史
  7. java jlabel位置_Java Swing – JLabel位置
  8. UGUI的ScrollRect
  9. 同济大学计算机保研名单,同济大学2021届保研率27.8%,主要保研本校、复交清国...
  10. oracle删除redo 未重启,恢复误删数据文件(数据库未重启,无备份)