Example #1
0
 public IActionResult CrossPartial([FromBody] CrossSearch para)
 {
     if (para != null)
     {
         searchCondition = para;
     }
     return(PartialView());
 }
Example #2
0
 public IActionResult Cross(CrossSearch para)
 {
     if (para != null)
     {
         searchCondition = para;
     }
     return(View());
 }
Example #3
0
 public static T Find <T>(this CrossSearch <T> search) where T : MemberInfo
 {
     return(((CrossSearch)search).Find() as T);
 }
Example #4
0
 public static object Find(this CrossSearch search)
 {
     return(Config.Find(search));
 }
Example #5
0
    public object Find(CrossSearch search)
    {
        string prefix = "UNKNOWN_";

        if (search.Type == CrossSearch.t_FieldInfo)
        {
            CrossSearch <FieldInfo> search_ = (CrossSearch <FieldInfo>)search;
            prefix = search.Returns.Name + "_";
            prefix = prefix[0].ToString().ToLowerInvariant() + prefix.Substring(1);
        }
        else if (search.Type == CrossSearch.t_MethodInfo)
        {
            CrossSearch <MethodInfo> search_ = (CrossSearch <MethodInfo>)search;
            prefix = search.Static ? "smethod_" : "method_";
        }
        else if (search.Type == CrossSearch.t_PropertyInfo)
        {
            CrossSearch <PropertyInfo> search_ = (CrossSearch <PropertyInfo>)search;
            prefix = search.Returns.Name + "_";
        }

        int preID = -1;

        if (!string.IsNullOrEmpty(search.Name))
        {
            preID = int.Parse(search.Name.Substring(search.Name.IndexOf('_') + 1));
        }

        int  preTypeID = -1;
        long typeOr    = 0;
        long typeAnd   = long.MaxValue;

        if (!string.IsNullOrEmpty(search.In))
        {
            if (search.In.StartsWith("GClass"))
            {
                if (search.In.Contains("`"))
                {
                    string[] ids = search.In.Substring(6).Split('`');
                    preTypeID = int.Parse(ids[0]);
                    typeOr   |= int.Parse(ids[1]) << 32;
                }
                else
                {
                    preTypeID = int.Parse(search.In.Substring(6));
                }
            }
            else
            {
                object obj = FindInType(search, search.In.XType(), prefix, preID);
                if (obj != null)
                {
                    return(obj);
                }
            }
        }

        if (preTypeID != -1)
        {
            for (int ti = Math.Max(0, preTypeID - SearchFocusRadius); ti <= preTypeID + SearchFocusRadius && ti < GClasses.Count; ti++)
            {
                Type gclass;
                if (!GClasses.TryGetValue((ti & typeAnd) | typeOr, out gclass))
                {
                    continue;
                }
                object obj = FindInType(search, gclass, prefix, preID);
                if (obj != null)
                {
                    return(obj);
                }
            }
        }

        for (int ti = 0; ti < GClasses.Count; ti++)
        {
            if (preTypeID != -1 && preTypeID - SearchFocusRadius <= ti && ti <= preTypeID + SearchFocusRadius)
            {
                continue;
            }
            Type gclass;
            if (!GClasses.TryGetValue((ti & typeAnd) | typeOr, out gclass))
            {
                continue;
            }
            object obj = FindInType(search, gclass, prefix, preID);
            if (obj != null)
            {
                return(obj);
            }
        }

        return(null);
    }
Example #6
0
    public object FindInType(CrossSearch search, Type @in, string prefix, int preID)
    {
        // Check the context here; return null prematurely if context doesn't match.
        if (search.Context != null && search.Context.Length != 0)
        {
            // TODO check context!
        }

        BindingFlags flags =
            (search.Private ? BindingFlags.NonPublic : search.Public ? BindingFlags.Public : BindingFlags.Default) |
            (search.Static ? BindingFlags.Static : BindingFlags.Instance)
        ;

        if (search.Type == CrossSearch.t_FieldInfo)
        {
            // We just return the field. There's currently a too high risk of false positives.
            return(@in.GetField(search.Name, flags));
        }
        else if (search.Type == CrossSearch.t_PropertyInfo)
        {
            // We do the same with the properties as with the fields.
            return(@in.GetProperty(search.Name, flags));
        }

        if (search.Type != CrossSearch.t_MethodInfo)
        {
            return(null);
        }

        // With methods, we can actually search.
        Console.WriteLine("METHOD RADIUS SEARCH?");
        if (preID != -1)
        {
            Console.WriteLine("METHOD RADIUS SEARCH.");
            for (int mi = Math.Max(0, preID - SearchFocusRadius); mi <= preID + SearchFocusRadius; mi++)
            {
                Console.WriteLine(prefix + mi);
                MethodInfo method = @in.GetMethod(prefix + mi, flags, null, search.Args, null);
                if (method == null)
                {
                    continue;
                }
                return(method);
            }
        }

        // No method match? Huh, now we need to crawl through all properly flagged methods...
        MethodInfo[] methods = @in.GetMethods(flags);
        for (int mi = 0; mi < methods.Length; mi++)
        {
            MethodInfo      method   = methods[mi];
            ParameterInfo[] argsInfo = method.GetParameters();
            if (!method.Name.StartsWith(prefix) ||
                argsInfo.Length != search.Args.Length ||
                method.ReturnType != (search.Returns ?? CrossSearch.t_void))
            {
                continue;
            }
            bool match = true;
            for (int pi = 0; pi < argsInfo.Length; pi++)
            {
                if (argsInfo[pi].ParameterType != search.Args[pi])
                {
                    match = false;
                    continue;
                }
            }
            if (!match)
            {
                continue;
            }
            return(method);
        }

        return(null);
    }