使用asp.net mvc习惯了,最近项目中又开始使用asp.net,有大量的ajax方法调用,之前有两种方法来处理:
- Switch case :方法少还行,如果很多,就太蛋疼了,而且方法堆在一块,也不美观
- 匿名方法:方法复用不好,vs代码也不便于折叠
最近研究了一下用反射方法来做,把类中所有公开方法都通过反射找出存到字典中,调用时匹配字典中的key,看是否有此方法。
以下是我写的方法,这种方法我总结有以下优点:
- 不用大量写大量判断语句,简洁
- 方法可以复用
- 可以集中处理一些事情,如调用前监控,处理;异常处理;...
- 如果有不同实现,可以调用不同的接口(虚方法)的实现(我这里为了省事,没有用接口)
但是我不知道这样写,会不会有性能损耗,是否还有优化的地方,欢迎大家指点。
1 public class NewServices : IHttpHandler 2 { 3 private static readonly IDictionary<string, MethodInfo> Services = new Dictionary<string, MethodInfo>(StringComparer.OrdinalIgnoreCase); 4 5 public void ProcessRequest(HttpContext context) 6 { 7 var action = context.Request["action"]; 8 MethodInfo method; 9 if (action.IsNotNullAndWhiteSpace() && Services.TryGetValue(action, out method)) 10 { 11 try 12 { 13 method.Invoke(new NewServicesApi(context), null); 14 } 15 catch (Exception ex) 16 { 17 context.WriteJson(new JsonResultInfo().SetError(ex.Message)); 18 } 19 } 20 else 21 { 22 context.WriteJson(new JsonResultInfo().SetError("{0}方法不存在!".FormatWith(action))); 23 } 24 } 25 26 static NewServices() 27 { 28 Services.Clear(); 29 var methods = typeof(NewServicesApi).GetMethods(BindingFlags.Public | BindingFlags.Instance); 30 foreach (var m in methods) 31 { 32 Services.Add(m.Name, m); 33 } 34 } 35 public bool IsReusable { get { return false; } } 36 } 37 38 internal class NewServicesApi 39 { 40 private HttpContext context; 41 private HttpRequest Request; 42 private HttpResponse Response; 43 public NewServicesApi(HttpContext context) 44 { 45 this.context = context; 46 Request = context.Request; 47 Response = context.Response; 48 } 49 public void Test() 50 { 51 Response.Write("test"); 52 } 53 }