bool invokeInline(string prefix, Type type, string name, object value, out ISiteseer new_op) { if (value != null) { MemberInfo[] graph_props = type.FindMembers(MemberTypes.Property|MemberTypes.Field, BindingFlags.Public|BindingFlags.Instance, null, null); List<Type> param_list = new List<Type>(); List<Object> args_list = new List<Object>(); foreach (MemberInfo p in graph_props) { if (MemberTypes.Field == p.MemberType) { FieldInfo fi = type.GetField(p.Name); args_list.Add(fi.GetValue(value)); param_list.Add(fi.FieldType); } else { PropertyInfo pi = type.GetProperty(p.Name); if (0 == pi.GetIndexParameters().Length) { args_list.Add(pi.GetValue(value, null)); param_list.Add(pi.PropertyType); } } } Type[] param_array = new Type[param_list.Count]; Object[] arg_array = new Object[args_list.Count]; param_list.CopyTo(param_array); args_list.CopyTo(arg_array); string method_name = prefix+"_"+type.Name+(name!=null?"_"+name:""); MethodInfo mi = GetMethod(method_name, param_array); if (mi != null) { Object new_visitor = mi.Invoke(m_visitor, arg_array); if (null == new_visitor) { new_op = null; Trace.Warning("debug: {0}.{1}({2}) did not return a new visitor", m_visitor_type.FullName, method_name, make_type_string(param_array)); } else { new_op = new VisitSiteseer(new_visitor, m_aliases); } return true; } else { Trace.Warning("debug: could not find method {0}.{1}({2}), skipping", m_visitor_type.FullName, method_name, make_type_string(param_array)); } } new_op = null; return false; }
bool invokeTerminal(string method_name, Type type, object value, out ISiteseer new_op) { while (type != null) { Type[] types = { type }; MethodInfo mi = GetMethod(method_name, types); if (mi != null) { object[] args = { value }; Object new_visitor = mi.Invoke(m_visitor, args); if (null == new_visitor) { new_op = null; Trace.Warning("debug: {0}.{1}({2}) did not return a new visitor", m_visitor_type.FullName, method_name, type.FullName); } else { new_op = new VisitSiteseer(new_visitor, m_aliases); } return true; } else { Trace.Warning("debug: could not find method {0}.{1}({2}), skipping", m_visitor_type.FullName, method_name, type.FullName); type = type.BaseType; } } new_op = null; return false; }
bool innerCall(string method_name, out ISiteseer new_method, bool is_last) { MethodInfo mi = GetMethod(method_name, no_params); if (mi != null) { Object new_visitor = mi.Invoke(m_visitor, no_args); if (null == new_visitor) { new_method = null; if (!is_last) Trace.Verbose("debug: {0} did not return a new visitor", method_name); } else { new_method = new VisitSiteseer(new_visitor, m_aliases); } return true; } else { if (is_last) Trace.Warning("debug: could not find method {0}.{1}(), skipping", m_visitor_type.FullName, method_name); new_method = null; return false; } }