// can handle all methods public static StringBuilder BuildMethods(Type type, MethodInfo[] methods, int slot, List <string> lstNames) { string fmt = @" /* {6} */ _jstype.definition.{1} = function({2}) [[ {9} return CS.Call({7}, {3}, {4}, false, {8}{5}); ]]"; string fmtStatic = @" /* static {6} {8} */ _jstype.staticDefinition.{1} = function({2}) [[ {9} return CS.Call({7}, {3}, {4}, true{5}); ]]"; //bool bIsSystemObject = (type == typeof(System.Object)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < methods.Length; i++) { MethodInfo method = methods[i]; bool bOverloaded = ((i > 0 && method.Name == methods[i - 1].Name) || (i < methods.Length - 1 && method.Name == methods[i + 1].Name)); if (!bOverloaded) { if (GeneratorHelp.MethodIsOverloaded(type, method.Name)) { bOverloaded = true; //Debug.Log("$$$ " + type.Name + "." + method.Name + (method.IsStatic ? " true" : " false")); } } StringBuilder sbFormalParam = new StringBuilder(); StringBuilder sbActualParam = new StringBuilder(); ParameterInfo[] paramS = method.GetParameters(); StringBuilder sbInitT = new StringBuilder(); int TCount = 0; // add T to formal param if (method.IsGenericMethodDefinition) { TCount = method.GetGenericArguments().Length; for (int j = 0; j < TCount; j++) { sbFormalParam.AppendFormat("t{0}", j); if (j < TCount - 1 || paramS.Length > 0) { sbFormalParam.Append(", "); } sbInitT.AppendFormat(" var native_t{0} = t{0}.getNativeType();\n", j); sbActualParam.AppendFormat(", native_t{0}", j); } } int L = paramS.Length; for (int j = 0; j < L; j++) { sbFormalParam.AppendFormat("a{0}/*{1}*/{2}", j, paramS[j].ParameterType.Name, (j == L - 1 ? "" : ", ")); ParameterInfo par = paramS[j]; if (par.ParameterType.IsArray && par.GetCustomAttributes(typeof(ParamArrayAttribute), false).Length > 0) { sbActualParam.AppendFormat(", jsb_formatParamsArray({0}, a{0}, arguments)", j); } else { sbActualParam.AppendFormat(", a{0}", j); } } //int TCount = method.GetGenericArguments().Length; string methodName = method.Name; // if (methodName == "ToString") { methodName = "toString"; } string mName = SharpKitMethodName(methodName, paramS, bOverloaded, TCount); lstNames.Add((method.IsStatic ? "Static_" : "") + mName); if (!method.IsStatic) { sb.AppendFormat(fmt, className, mName, // [1] method name sbFormalParam.ToString(), // [2] formal param slot, // [3] slot i, // [4] index sbActualParam, // [5] actual param method.ReturnType.Name, // [6] return type name (int)JSVCall.Oper.METHOD, // [7] OP "this", // [8] this sbInitT //[9] generic types init ); } else { sb.AppendFormat(fmtStatic, className, mName, sbFormalParam.ToString(), slot, i, sbActualParam, method.ReturnType.Name, (int)JSVCall.Oper.METHOD, "", sbInitT); } } return(sb); }
public static void BuildMethods(Type type, MethodInfo[] methods, int slot, StringBuilder sbDefinition, StringBuilder sbStaticDefinition, List <string> memberNames) { for (int index = 0; index < methods.Length; index++) { var method = methods[index]; string methodName = method.Name; if (methodName == "ToString") { methodName = "toString"; } bool isStatic = method.IsStatic; bool overloaded = (index > 0 && method.Name == methods[index - 1].Name) || (index < methods.Length - 1 && method.Name == methods[index + 1].Name); if (!overloaded) { if (GeneratorHelp.MethodIsOverloaded(type, method)) { overloaded = true; //Debug.Log("$$$ " + type.Name + "." + method.Name + (method.IsStatic ? " true" : " false")); } } var sbFormalParam = new StringBuilder(); var sbActualParam = new StringBuilder(); var paramS = method.GetParameters(); var sbInitGenericParam = new StringBuilder(); // add T to formal param int genericArgsCount = 0; //包含泛型参数个数 if (method.IsGenericMethodDefinition) { genericArgsCount = method.GetGenericArguments().Length; for (int j = 0; j < genericArgsCount; j++) { sbFormalParam.AppendFormat("t{0}", j); if (j < genericArgsCount - 1 || paramS.Length > 0) { sbFormalParam.Append(", "); } sbInitGenericParam.AppendFormat("\n var native_t{0} = t{0}.getNativeType();", j); sbActualParam.AppendFormat(", native_t{0}", j); } } string jsMethodName = GetOverloadedMethodSuffix(methodName, paramS, overloaded, genericArgsCount); memberNames.Add((isStatic ? "Static_" : "") + jsMethodName); //判断该方法是否有定义CsExportedMethodAttribute属性 CsExportedMethodAttribute csExportedAttr = null; if (method.IsDefined(typeof(CsExportedMethodAttribute), false)) { var attributes = method.GetCustomAttributes(typeof(CsExportedMethodAttribute), false); csExportedAttr = attributes[0] as CsExportedMethodAttribute; } if (CsExportedMethodDic != null && CsExportedMethodDic.ContainsKey(type)) { CsExportedMethodDic[type].TryGetValue(method.Name, out csExportedAttr); } if (csExportedAttr != null) { string jsCode = csExportedAttr.JsCode; if (isStatic) { sbStaticDefinition.Append(jsCode); } else { sbDefinition.Append(jsCode); } continue; } int paramLength = paramS.Length; for (int j = 0; j < paramLength; j++) { sbFormalParam.AppendFormat("a{0}/*{1}*/{2}", j, paramS[j].ParameterType.Name, j == paramLength - 1 ? "" : ", "); var par = paramS[j]; if (par.ParameterType.IsArray && par.GetCustomAttributes(typeof(ParamArrayAttribute), false).Length > 0) { sbActualParam.AppendFormat(", jsb_formatParamsArray({0}, a{0}, arguments)", j); } else if (par.ParameterType.IsArray && par.ParameterType.GetElementType() == typeof(Type)) { //如果是System.Type类型数组参数,通过转换获取其类型全名数组 sbActualParam.AppendFormat(", jsb_convertTypeParamsArray(a{0})", j); } else if (par.ParameterType == typeof(Type)) { //如果是System.Type类型参数需要传递其FullName回来 //在C#层通过JSDataExchangeMgr.GetTypeByName获取其类型对象 sbActualParam.AppendFormat(", a{0} != null ? a{0}.get_FullName() : null", j); } else if (par.ParameterType == typeof(Exception)) { sbActualParam.AppendFormat(", Error.getException(a{0})", j); } else { sbActualParam.AppendFormat(", a{0}", j); } } if (isStatic) { sbStaticDefinition.AppendFormat(@" {0}: function({1}) [[ {2} return CS.Call({3}, {4}, {5}, true{6}); //Ret: {7} ]],", jsMethodName, sbFormalParam, sbInitGenericParam, (int)JSVCall.Oper.METHOD, slot, index, sbActualParam, method.ReturnType.Name); } else { sbDefinition.AppendFormat(@" {0}: function({1}) [[ {2} return CS.Call({3}, {4}, {5}, false, this{6}); //Ret: {7} ]],", jsMethodName, sbFormalParam, sbInitGenericParam, (int)JSVCall.Oper.METHOD, slot, index, sbActualParam, method.ReturnType.Name); } } }