Ejemplo n.º 1
0
        private static string callLRRuntime(RunTime runtime, LRFunction lrf)
        {
            string        methodName = lrf.name;
            List <string> args       = lrf.args;
            var           parameters = new object[args.Count];

            for (int i = 0; i < parameters.Length; i++)
            {
                switch (args[i])
                {
                case "@EXTRARES":
                    parameters[i] = Keyword.EXTRARES;
                    break;

                case "@LAST":
                    parameters[i] = Keyword.LAST;
                    break;

                case "@ENDITEM":
                    parameters[i] = Keyword.ENDITEM;
                    break;

                case "@ITEMDATA":
                    parameters[i] = Keyword.ITEMDATA;
                    break;

                default:
                    parameters[i] = args[i];
                    break;
                }
            }



            Type t      = typeof(APITest.LR.Interface.iLRFunctions);
            var  method = t.GetMethod(methodName);

            if (method != null)
            {
                Type oType   = runtime.GetType();
                var  oMethod = oType.GetMethod(method.Name);


                var methodParamters = oMethod.GetParameters();
                var useParamters    = new object[methodParamters.Length];



                //组装参数
                for (int i = 0; i < useParamters.Length; i++)
                {
                    //传入参数 < 需要的参数 使用默认值
                    if (parameters.Length <= i)
                    {
                        if (methodParamters[i].ParameterType == typeof(string))
                        {
                            if (methodParamters[i].HasDefaultValue)
                            {
                                useParamters[i] = methodParamters[i].DefaultValue;
                                continue;
                            }
                            else
                            {
                                throw new Exception($"{methodName} 缺少必要参数");
                            }
                        }
                        else
                        {
                            useParamters[i] = new object[0];
                        }
                    }


                    if (methodParamters[i].ParameterType == typeof(string))
                    {
                        useParamters[i] = parameters[i];
                    }
                    else
                    {
                        //如果参数不是 string 类型 那么肯定是 object[] 可选参数,讲剩下的参数组装成object[] 参数
                        var objs = new Object[parameters.Length - i];
                        for (int y = 0; y < objs.Length; y++)
                        {
                            objs[y] = parameters[y + i];
                        }
                        useParamters[i] = objs;
                        break;
                    }
                }

                var rtn = oMethod.Invoke(runtime, useParamters);
                if (rtn == null)
                {
                    return("True");
                }
                return(rtn.ToString());
            }
            else
            {
                throw new Exception($"找不到方法 {methodName}");
            }
        }