背景:
上周搬到新组开发一个微信端的项目,发现这里前台页面部分都是ajax提交到handler,然后handler的ProcessRequest方法接收提交过来的参数,通过参数中的type选择要执行的方法(这里就是访问数据库的操作和一些业务逻辑的调用,分页等等),处理完成之后返回json串到ajax的success方法,然后显示。
其实ajax提交到handler和提交到后台感觉没多大区别,百度了下,感觉handler是后台程序的简化版,执行更快。
ok,今天说的其实是一个比较细节的问题,先看一段代码:
public void ProcessRequest(HttpContext context) { if (context.Request["type"] != null) { context.Response.ContentType = "text/plain"; context.Response.Buffer = true; context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1); context.Response.AddHeader("pragma","no-cache"); context.Response.AddHeader("cache-control",""); context.Response.CacheControl = "no-cache"; string type = context.Request["type"].ToString(); switch (type) { case "getsellerlist": GetSellerList(context); break; case "getsellerinfo": GetSellerInfo(context); break; case "getsellernormalinfo": GetSellerNormalInfo(context); break; case "getsellernormallist": GetSellerNormalList(context); break; case "getsellerpropertylist": GetSellerPropertyLity(context); break; case "getscopelist": GetScopeList(context); break; case "imgupload": ImgUpload(context); break; case "chefupload": ChefUpload(context); break; case "sellerupload": SellerUpload(context); break; case "storeupload": StoreUpload(context); break; case"LoadSellerDataByPartner": LoadSellerDataByPartner(context); break; } } }
上面这段代码是handler处理程序的入口,从这里根据type选择要执行哪个方法。但是一般,一个handler要处理的一个页面上的很多事件,我每加一个方法,就要去修改switch..case部分,这是很违反开放封闭原则的,理想情况下是这样,我每加一个方法,原来写好的程序段都是不可以被修改的,但是可以在原来的基础上增加。
所以,我们这样:
#region 反射取出这里的switch_case的方法,但是要求传过来的type要跟方法名称完全一致 System.Reflection.MethodInfo ChosedMethod = this.GetType().GetMethod(type);//利用反射根据传进来的值选取要被执行的方法 if (ChosedMethod != null) { ChosedMethod.Invoke(this,new object[] { context }); } } #endregion
我们在程序里面通过反射动态加载方法,超级方便哎~~~以后再也不用超长的switch...case了。
小结:
最近在新公司修bug的时候,看到那些像屎一样的代码感觉编写可读性强的代码是非常有必要的,代码应该写出来让别人看着像工艺品,不应该是满眼看去一坨一坨的。。。。