1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | public static class LinqExtensions { private static PropertyInfo GetPropertyInfo(Type objType, string name) { var properties = objType.GetProperties(); var matchedProperty = properties.FirstOrDefault(p => p.Name == name); if (matchedProperty == null ) throw new ArgumentException( "name" ); return matchedProperty; } private static LambdaExpression GetOrderExpression(Type objType, PropertyInfo pi) { var paramExpr = Expression.Parameter(objType); var propAccess = Expression.PropertyOrField(paramExpr, pi.Name); var expr = Expression.Lambda(propAccess, paramExpr); return expr; } public static IEnumerable<T> OrderBy<T>( this IEnumerable<T> query, string name) { var propInfo = GetPropertyInfo( typeof (T), name); var expr = GetOrderExpression( typeof (T), propInfo); var method = typeof (Enumerable).GetMethods().FirstOrDefault(m => m.Name == "OrderBy" && m.GetParameters().Length == 2); var genericMethod = method.MakeGenericMethod( typeof (T), propInfo.PropertyType); return (IEnumerable<T>)genericMethod.Invoke( null , new object [] { query, expr.Compile() }); } public static IQueryable<T> OrderBy<T>( this IQueryable<T> query, string name) { var propInfo = GetPropertyInfo( typeof (T), name); var expr = GetOrderExpression( typeof (T), propInfo); var method = typeof (Queryable).GetMethods().FirstOrDefault(m => m.Name == "OrderBy" && m.GetParameters().Length == 2); var genericMethod = method.MakeGenericMethod( typeof (T), propInfo.PropertyType); return (IQueryable<T>)genericMethod.Invoke( null , new object [] { query, expr }); } public static IEnumerable<T> OrderByDescending<T>( this IEnumerable<T> query, string name) { var propInfo = GetPropertyInfo( typeof (T), name); var expr = GetOrderExpression( typeof (T), propInfo); var method = typeof (Enumerable).GetMethods().FirstOrDefault(m => m.Name == "OrderByDescending" && m.GetParameters().Length == 2); var genericMethod = method.MakeGenericMethod( typeof (T), propInfo.PropertyType); return (IEnumerable<T>)genericMethod.Invoke( null , new object [] { query, expr.Compile() }); } public static IQueryable<T> OrderByDescending<T>( this IQueryable<T> query, string name) { var propInfo = GetPropertyInfo( typeof (T), name); var expr = GetOrderExpression( typeof (T), propInfo); var method = typeof (Queryable).GetMethods().FirstOrDefault(m => m.Name == "OrderByDescending" && m.GetParameters().Length == 2); var genericMethod = method.MakeGenericMethod( typeof (T), propInfo.PropertyType); return (IQueryable<T>)genericMethod.Invoke( null , new object [] { query, expr }); } } |
基础
1 2 3 4 5 6 7 8 9 10 11 12 13 | //常规方法 var query = s.OrderBy(x =>x.Age); //排序 s.OrderBy(x => GetPropertyValue(x, "Age" )) //函数支持 private static object GetPropertyValue( object obj, string property) { PropertyInfo propertyInfo = obj.GetType().GetProperty(property); return propertyInfo.GetValue(obj, null ); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2019-04-14 asp.net core 基于角色的认证登陆
2019-04-14 ASP.NET Core 2.0系列学习笔记-NLog日志配置文件