数据构造(二) 反射执行方法
前提:只知道程序名称 xxxx.exe
适用于通过 字符串名称调用方法
/// <summary> /// 反射调用方法入口处理函数 /// </summary> /// <param name="str"></param> /// <returns></returns> public virtual string EventHander(string str) { if (this.InvokeRequired) { this.Invoke(new MethodInvoker(() => { this.EventHander(str); })); } var Info = str.Split('|'); var classInfo = Info[0].Split('?'); var value = Info.Length > 1 && Info[1] != "undefined" && !string.IsNullOrEmpty(Info[1]) ? Info[1].Split('&') : null; var result = ExeMethod(classInfo, value); if (result == null) { return ""; } if (result.Msg != null) { FormTools.ShowTip(result.Msg); } if (result.ResultType == ResultType.method) { return EventHander(result.Result.ToString()); } return result.Result.ToString(); } /// <summary> /// 执行方法 并返回数据 /// </summary> public Results ExeMethod(string[] classInfo, string[] value) { try { //获取程序集 所有类型 var exeNames = Application.ExecutablePath.Replace(Application.StartupPath, "").Replace(@"\", ""); var ass = Assembly.LoadFrom(exeNames); var mytypes = ass.GetTypes(); foreach (var my in mytypes.Where(my => my.Name.ToLower().Equals(classInfo[0].ToLower() + "controller"))) { //实例化对象 实例参数 var objName = Activator.CreateInstance(my); //执行方法 var LoginForm = my.GetMethod(classInfo[1]); return (Results) LoginForm.Invoke(objName, value); } throw new MessageTipShow("没有找到相关方法:" + classInfo[0]); } catch (TargetInvocationException em) { throw em; } catch (Exception e) { throw e; } }
调用
var action="Home?GetList"; var value="支出" EventHander(action + "|" + value)
嫌弃原生winform控件,那么可以写上这个方法,然后在html页面 调用这个方法执行前后台交互调用实例如下
/** * * @param {} action 后台控制器和方法名 用?链接 * @param {} value 参数 用&链接 * @returns {} object */ function Hander(action, value) { return window.external.EventHander(action + "|" + value); }