天天看點

資料構造工具類(二)反射執行方法

資料構造(二) 反射執行方法

前提:隻知道程式名稱 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);
}