public static unsafe int Cs(IntPtr clientData, IntPtr interp, int objc, IntPtr *argv) { Program.mainInterpreter.ErrorMessage = ""; if (objc < 3) { Program.mainInterpreter.ErrorMessage = "Not enough parameters provided for the command." + NL + "Correct command format: 'cs $object $member $parameters'." + NL + "For more info type 'cshelp'."; return(TclInterpreter.TCL_ERROR); } Type objType = null; object obj = TclAPI.FindCsObject(argv[1]); if (obj == null) { string str = TclAPI.GetCsString(argv[1]); objType = TclAPI.GetCsTypeFromName(str); if (objType == null) { Program.mainInterpreter.ErrorMessage = "The parameter '" + str + "' could not be linked to any C# object or type."; return(TclInterpreter.TCL_ERROR); } } else { objType = obj.GetType(); } object result = null; // Required data - can be Method or Property string requiredMember = TclAPI.GetCsString(argv[2]); IEnumerable <MemberInfo> candidates = objType.GetMembers().Where(m => m.Name == requiredMember && TclAPI.IsAPICompatibleMember(m)); // Method if (candidates.FirstOrDefault() is MethodInfo) { int totalParams = objc - 3; IEnumerable <MethodInfo> matchedMethods = candidates.Where(m => m.MemberType == MemberTypes.Method) .Cast <MethodInfo>().Where(m => m.GetParameters().Count() == totalParams); // Convert the tcl parameters to cs objects object[] parameters = new object[totalParams]; for (int i = 0; i < totalParams; i++) { object csObj = TclAPI.Tcl2Cs(argv[3 + i]); if (csObj == null) { string args = "Parameters:" + Environment.NewLine; for (int j = 0; j < objc; j++) { args += j + ": " + TclAPI.GetCsString(argv[j]) + Environment.NewLine; } throw new ArgumentException("Invalid parameter provided at index: " + (3 + i).ToString() + Environment.NewLine + args); } parameters[i] = csObj; } // Try the candidate methods until one works bool success = false; foreach (MethodInfo method in matchedMethods) { try { result = method.Invoke(obj, parameters); /*if(result != null && !result.GetType().Equals(method.ReturnType)) * Console.WriteLine("Type Difference");*/ success = true; break; } catch (Exception) { } } // If invoked method was void if (success) { if (result == null) { TclDLL.Tcl_ResetResult(interp); return(0); } } else { Program.mainInterpreter.ErrorMessage += "No method overload could be executed for the method " + requiredMember + NL; } } // Property else if (candidates.Count() == 1 && candidates.FirstOrDefault() is PropertyInfo p) { result = p.GetValue(obj, null); } TclDLL.Tcl_SetObjResult(interp, TclAPI.Cs2Tcl(result)); if (result == null) { Program.mainInterpreter.ErrorMessage += "'" + requiredMember + "' returned null."; return(TclInterpreter.TCL_WARNING); } return(0); }
public static unsafe int Test(IntPtr clientData, IntPtr interp, int objc, IntPtr *argv) { TclAPI.Tcl2Cs(argv[1]); return(0); }