public CallDescriptor(ControllerDescriptor controller, MethodInfo method)
 {
     Controller        = controller;
     Descriptor        = MethodDescriptorAttribute.GetDescriptor(method);
     CacheHeader       = CachingAttribute.GetAttribute(method);
     TokenRequirements = RequiresTokenAttribute.GetAttribute(method);
     Info              = method;
     Parameters        = Info.GetParameters().Select(x => new ParameterDescriptor(x)).ToList();
     JsonSerialization = JsonSerializerAttribute.GetAttribute(method);
     Attributes        = Info.GetCustomAttributes().ToDictionary(x => x.GetType(), y => y);
 }
        public static JSBFunction CreateLinkFunction(string baseApiPath, string controller, MethodInfo info, bool useName)
        {
            List <ParameterInfo> paras = info.GetParameters().Where(x => !BodyAttribute.HasAttribute(x)).ToList();

            ParameterInfo bodyParameter = info.GetParameters().FirstOrDefault(x => BodyAttribute.HasAttribute(x));
            string        bodyParaName  = (bodyParameter != null) ? bodyParameter.Name : "";
            BodyAttribute bodyAttr      = null;

            if (bodyParameter != null)
            {
                bodyAttr = BodyAttribute.GetAttribute(bodyParameter);
            }


            List <string> stringParas = paras.Select(x => x.Name).ToList();

            MethodDescriptorAttribute descriptor = MethodDescriptorAttribute.GetDescriptor(info);

            if (descriptor != null)
            {
                //stringParas = new List<string>();

                foreach (string para in descriptor.Parameters)
                {
                    if (!stringParas.Contains(para))
                    {
                        stringParas.Add(para);
                    }
                }

                if (descriptor.HasPostParameter)
                {
                    bodyParaName = descriptor.PostParameter;
                }
            }

            if (RequiresTokenAttribute.HasAttribute(info))
            {
                stringParas.Add("t");
            }

            JSBuilder code = new JSBuilder();

            StringBuilder paraString = new StringBuilder();

            for (int i = 0; i < stringParas.Count; i++)
            {
                if (i == 0)
                {
                    paraString.Append("?");
                }
                else
                {
                    paraString.Append("&");
                }
                paraString.Append(stringParas[i] + "=' + " + stringParas[i] + " + '");
            }

            if (RequiresTokenAttribute.HasAttribute(info))
            {
                code.AddCode("if(!t) t = Sync.Token;");
            }

            string baseUrlPrepend = ((APIBaseUrl != "") ? $"{APIBaseUrl}/" : "");

            if (!string.IsNullOrEmpty(bodyParaName))
            {
                if (bodyAttr != null && bodyAttr.BodyType == BodyType.Raw)
                {
                    if (descriptor != null && descriptor.ResponseType == BodyType.Raw)
                    {
                        code.AddCode($"SyncPostRawRaw('{baseUrlPrepend + controller}/{info.Name}{paraString.ToString()}', {bodyParaName}, callback);");
                    }
                    else
                    {
                        code.AddCode($"SyncPostRawJson('{baseUrlPrepend + controller}/{info.Name}{paraString.ToString()}', {bodyParaName}, callback);");
                    }
                }
                else
                {
                    if (descriptor != null && descriptor.ResponseType == BodyType.Raw)
                    {
                        code.AddCode($"SyncPostJsonRaw('{baseUrlPrepend + controller}/{info.Name}{paraString.ToString()}', {"JSON.stringify(" + bodyParaName + ")"}, callback);");
                    }
                    else
                    {
                        code.AddCode($"SyncPostJson('{baseUrlPrepend + controller}/{info.Name}{paraString.ToString()}', {"JSON.stringify(" + bodyParaName + ")"}, callback);");
                    }
                }
            }
            else
            {
                if (descriptor != null && descriptor.ResponseType == BodyType.Raw)
                {
                    code.AddCode($"SyncGetRaw('{baseUrlPrepend + controller}/{info.Name}{paraString.ToString()}', callback);");
                }
                else
                {
                    code.AddCode($"SyncGetJson('{baseUrlPrepend + controller}/{info.Name}{paraString.ToString()}', callback);");
                }
            }

            if (!string.IsNullOrEmpty(bodyParaName))
            {
                if (stringParas.LastOrDefault() == "t")
                {
                    stringParas.Insert(stringParas.Count - 1, bodyParaName);
                }
                else
                {
                    stringParas.Add(bodyParaName);
                }
            }
            if (stringParas.LastOrDefault() == "t")
            {
                stringParas.Insert(stringParas.Count - 1, "callback");
            }
            else
            {
                stringParas.Add("callback");
            }

            JSBFunction func = new JSBFunction(((useName) ? info.Name : null), code, stringParas.ToArray());

            return(func);
        }