/// <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);
        }
Exemple #2
0
 /// <summary>
 /// 输出方法
 /// </summary>
 /// <param name="title"></param>
 /// <param name="p"></param>
 private void Echo(string p)
 {
     ApiPlugin.ShowMessage(p, ConsoleColor.Green);
 }