public IActionResult CrossPartial([FromBody] CrossSearch para) { if (para != null) { searchCondition = para; } return(PartialView()); }
public IActionResult Cross(CrossSearch para) { if (para != null) { searchCondition = para; } return(View()); }
public static T Find <T>(this CrossSearch <T> search) where T : MemberInfo { return(((CrossSearch)search).Find() as T); }
public static object Find(this CrossSearch search) { return(Config.Find(search)); }
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); }
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); }