private KeyValuePair <bool, string> GenerateGenericMethodTemplate(MetaMethodInfo method, string parameters) { Type classType = method.method.ReflectedType; string externionsClassName = "Generic." + classType.Name + "Externions"; string externionsMethodName = method.name; if (!CheckExternionsMethod(externionsClassName, externionsMethodName, method.method)) { var pars = method.method.GetParameters(); var args = method.method.GetGenericArguments(); var parametersString = ""; if (!method.method.IsStatic) { parametersString += "this " + classType.FullName + " self"; if (parameters.Length > 0 || args.Length > 0) { parametersString += ", "; } } for (int i = 0; i < pars.Length; i++) { if (i != 0) { parametersString += ", "; } var par = pars[i]; parametersString += par.ParameterType.FullName + " " + par.Name; } for (int i = 0; i < args.Length; i++) { if (i != 0 || pars.Length > 0) { parametersString += ", "; } parametersString += "System.Type " + args[i].Name; } var csharpMethod = string.Format("{0}.{1}({2})", externionsClassName, externionsMethodName, parametersString); Debug.LogWarningFormat("没有找到泛型方法的Lua导出:{0}", csharpMethod); return(new KeyValuePair <bool, string>(false, csharpMethod)); } else { return(new KeyValuePair <bool, string>(true, string.Format("{0}.{1}({2}{3})", externionsClassName, externionsMethodName, method.method.IsStatic ? string.Empty : (parameters.Length > 0 ? "{this}, " : "{this}"), parameters))); } }
void GenerateMethod(MetaMethodInfo method, bool forceBaned = false) { Type classType = method.method.ReflectedType; var pars = method.method.GetParameters(); var parameters = ""; for (int i = 0; i < pars.Length; i++) { if (i != 0) { parameters += ", "; } var par = pars[i]; parameters += "{" + (IsParams(par) ? "*" : string.Empty) + i.ToString() + "}"; } if (method.method.IsGenericMethod) { var args = method.method.GetGenericArguments(); for (int i = 0; i < args.Length; i++) { if (i != 0 || pars.Length > 0) { parameters += ", "; } parameters += "System.TypeOfTolua({^" + i.ToString() + "})"; } } KeyValuePair <bool, string> template; if (forceBaned) { template = new KeyValuePair <bool, string>(false, "custom baned!"); } else { template = (method.method.IsGenericMethod ? GenerateGenericMethodTemplate(method, parameters) : new KeyValuePair <bool, string>(true, GenerateNormalMethodTemplate(method, parameters))); } var genericArgumentsLength = (method.method.IsGenericMethod ? method.method.GetGenericArguments().Length : 0); sb.AppendFormat("\t\t\t\t<method name=\"{0}\" GenericArgCount=\"{1}\"{2}>\n", method.method.Name, genericArgumentsLength, !template.Key ? " Baned=\"true\" NotImplementMethod=\"" + template.Value + "\"" : " Template=\"" + template.Value + "\""); for (int i = 0; i < pars.Length; i++) { var par = pars[i]; sb.AppendFormat(GetArgumentTypeString(par.ParameterType, 5)); } sb.AppendFormat("\t\t\t\t</method>\n"); }
string GenerateNormalMethodTemplate(MetaMethodInfo method, string parameters) { Type classType = method.method.ReflectedType; return(string.Format("{0}{1}({2})", method.method.IsStatic ? classType.FullName + "." : "{this}:", method.name, parameters, " GenericArgCount=\"0\"")); }