public static IQueryable<T> GenerateByID<T>(this IAbstraXProviderService service, string id) { var queue = new Queue<string>(); var parser = new XPathParser<string>(); var builder = new XPathStringBuilder(); parser.Parse(id, builder); var axisElement = builder.PartQueue.OfType<XPathElement>().Last(); var method = service.GetType().GetMethods().Single(m => m.ReturnType.Name == "IQueryable`1" && m.GetParameters().Length == 0 && m.ReturnType.GetGenericArguments().Any(a => a.Name == axisElement.Text)); service.LogGenerateByID(id, method); var results = (IQueryable<IBase>)method.Invoke(service, null); service.PostLogGenerateByID(); return results.Where(b => b.ID == id).Cast<T>(); }
public static string GetQueryMethodForID(this IAbstraXProviderService service, string id) { var baseObject = service.GenerateByID(id); var method = service.GetType().GetMethods().Single(m => { var returnType = m.ReturnType; var args = returnType.GetGenericArguments(); if (returnType.Name == "IQueryable`1" && args.Length == 1 && args.First().Name == baseObject.GetType().Name && m.GetParameters().Length == 0) { return true; } else if (returnType.Name == baseObject.GetType().Name) { return true; } else { return false; } }); return method.Name; }