/// <summary> /// 动态调用事件方法 /// </summary> /// <param name="action">被调用方法</param> /// <param name="Data">提交的数据</param> /// <param name="Bianma">数据编码</param> /// <returns></returns> public string CallAction(string action, Hashtable Data, string Bianma) { // 生成调用方法名 string actionName = "Action_" + action.ToLower(); // 判断方法是否在数组中(不区分大小写) if (!ActionList.ToArray().Contains(actionName, StringComparer.OrdinalIgnoreCase)) { return("不存在的方法: " + action); } // 获取方法名(真实的) actionName = ActionList.Find(delegate(string name) { return(name.ToLower() == actionName.ToLower()); }); //获取方法的信息 MethodInfo method = this.GetType().GetMethod(actionName, bindingFlag); // 方法是否存在 if (method == null) { // 尝试读取 重定向属性 PropertyInfo property = this.GetType().GetProperty(actionName, bindingFlag); // 重定向存在就走重定向 if (property != null) { string actionNew = property.GetValue(this, null).ToString(); return(CallAction(actionNew, Data, Bianma)); } // 真不存在 return("不存在的方法: " + action); /* 尝试调用SDK方法 * method = Main.GetType().GetMethod(action); * Console.WriteLine("Main method : " + method); * * if (method == null) * { * return "不存在的方法: " + action; * } * * // 设置为重主类调用 * callObj = Main; * Console.WriteLine("Main: " + method); */ } // 如果是私有方法判断是否登录 if (method.IsPrivate && !IsLogin()) { ApiPlugin.ShowMessage("Receive An Api : " + action + " ...Failure"); return("尚未登陆成功,当前状态为:" + ApiPlugin.GetLoginStatus()); } // 获取方法的参数列表 ParameterInfo[] parametersInfo = method.GetParameters(); // 创建参数对象 object[] parameterList = new object[parametersInfo.Length]; // 不存在的参数列表 List <string> notSetList = new List <string>(); // 遍历参数 string parametersName; for (int i = 0; i < parametersInfo.Length; i++) { // 获取参数名 小写 parametersName = parametersInfo[i].Name.ToString().ToLower(); // 判断参数是否提交 if (!Data.ContainsKey(parametersName)) { // 判断是否必须参数 if (!parametersInfo[i].IsOptional) { notSetList.Add("(" + parametersInfo[i].ParameterType.Name + ")" + parametersName); continue; } // 非必填就置空 Data.Add(parametersName, null); } // 转换到需要的类型 string parameterValue = string.Empty; if (Data[parametersName] != null) { try { // 对取到的数据进行URL解码 parameterValue = HttpUtility.UrlDecode(Data[parametersName].ToString(), Encoding.GetEncoding(Bianma)); parameterList[i] = Convert.ChangeType(parameterValue, parametersInfo[i].ParameterType); } catch { notSetList.Add("(" + parametersInfo[i].ParameterType.Name + ")" + parametersName); } } else { parameterList[i] = parametersInfo[i].DefaultValue; } } // 如果有参数不存在就返回 if (notSetList.Count() > 0) { return("缺少参数或参数不合法: " + String.Join(", ", notSetList.ToArray())); } // 调用方法,用一个object接收返回值 object returnValue = string.Empty; try { returnValue = method.Invoke(this, bindingFlag, Type.DefaultBinder, parameterList, null); ApiPlugin.ShowMessage("Receive An Api : " + action + " ...Success"); } catch (Exception ex) { Console.WriteLine(ex); returnValue = "Receive An Api : " + action + " ...Error"; ApiPlugin.ShowMessage(returnValue.ToString()); } // 返回的内容文本 string retString = string.Empty; switch (method.ReturnType.Name) { // 正常应该返回此数据类型 case "RetJsonData": retString = JSON.Stringify(returnValue); break; // 空类型 case "Void": retString = JSON.Stringify(new RetJsonData()); break; // 字符串类型 case "String": retString = JSON.Stringify(new RetJsonData() { Msg = returnValue.ToString() }); break; // 整数型 case "Int32": retString = JSON.Stringify(new RetJsonData() { Code = Convert.ToInt32(returnValue), Msg = "" }); break; // 其他未知 default: retString = JSON.Stringify(new RetJsonData() { Data = returnValue }); break; } return(retString); }
/// <summary> /// 输出方法 /// </summary> /// <param name="title"></param> /// <param name="p"></param> private void Echo(string p) { ApiPlugin.ShowMessage(p, ConsoleColor.Green); }