示例#1
0
        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;
        }
示例#2
0
        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;
        }
示例#3
0
        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;
            }
        }