数据构造工具类(二)反射执行方法

数据构造(二) 反射执行方法

前提:只知道程序名称 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);
}


猜你喜欢

转载自blog.csdn.net/qq_28254093/article/details/80045163