public object Eval(object code) { TermList partList = code as TermList; if (partList == null) { if (code is SIProlog.Part) { partList = new TermList((SIProlog.Part)code); } } if (code is string) { partList = prologEngine.ParseQuery(code.ToString(), MT); } List <Dictionary <string, SIProlog.Part> > results = new List <Dictionary <string, SIProlog.Part> >(); prologEngine.askQuery(partList, MT, true, results, null); return(results); }
public bool CanInvokeObject(object o, string method, PartList methodArgs, out object result, TextWriter helpfulWarnings) { object[] invokeargs = new object[methodArgs.Count]; Type t = o.GetType(); string extraInfo = ""; foreach (var s in t.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static)) { if (s.Name.ToLower() == method.ToLower()) { var ps = s.GetParameters(); bool mismatch = false; if (ps.Length == methodArgs.Count) { for (int i = 0; i < ps.Length; i++) { ParameterInfo parameterInfo = ps[i]; var pt = parameterInfo.ParameterType; if (invokeargs[i] != null) { if (pt.IsInstanceOfType(invokeargs[i])) { continue; } } object op; if (!ConvertPart(methodArgs[i], pt, out op)) { mismatch = true; break; } invokeargs[i] = op; } } else { if (extraInfo == "") { extraInfo = " except with " + s; } continue; } if (!mismatch) { object io = s.IsStatic ? null : o; result = s.Invoke(io, invokeargs); if (result == null && s.ReturnType == typeof(void)) { result = Atom.PrologNIL; } return(true); } if (helpfulWarnings != null) { helpfulWarnings.WriteLine("mismatched " + s); } } } result = null; if (helpfulWarnings != null && extraInfo != "") { helpfulWarnings.WriteLine(extraInfo); } return(false); }
public bool CanInvokeObjectByName(string name, string method, PartList methodArgs, bool searchDownMembers, out object result, TextWriter helpfulWarningsOrNull) { List <object> objs; lock (NameToObjects) { if (!NameToObjects.TryGetValue(name, out objs) || objs.Count == 0) { if (helpfulWarningsOrNull != null) { helpfulWarningsOrNull.WriteLine("no such object named '" + name + "'"); } result = null; return(false); } } object[] os; lock (objs) { os = objs.ToArray(); } foreach (object o in os) { try { if (CanInvokeObject(o, method, methodArgs, out result, helpfulWarningsOrNull)) { return(true); } } catch (NotSupportedException nse) { continue; } } if (searchDownMembers) { HashSet <object> tryPlaces = new HashSet <object>(); foreach (object o in os) { foreach ( var membs in o.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance)) { object io = membs.IsStatic ? null : o; var tat = membs.GetValue(io); if (tat is IConvertible || tat is ValueType || tat == null) { continue; } tryPlaces.Add(tat); } if (false) { foreach ( var membs in o.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance)) { var ggm = membs.GetGetMethod(); if (ggm == null) { continue; } object io = ggm.IsStatic ? null : o; var tat = ggm.Invoke(io, null); if (tat is IConvertible || tat is ValueType || tat == null) { continue; } tryPlaces.Add(tat); } } } foreach (object o in os) { tryPlaces.Remove(o); } foreach (object o in tryPlaces) { if (CanInvokeObject(o, method, methodArgs, out result, helpfulWarningsOrNull)) { return(true); } } } if (helpfulWarningsOrNull != null) { helpfulWarningsOrNull.WriteLine("no such method '" + method + "' on an object named '" + name + "'"); } result = null; return(false); }