資料構造(二) 反射執行方法
前提:隻知道程式名稱 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);
}