通过Expression 动态实现IEnumerable<T> CustomOrderBy

最近在脑补Expression Tree 系列 http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html

然后发现 http://www.codeproject.com/Articles/235860/Expression-Tree-Basics 写得相当不错。

所以就稍微改动,实现了如下代码

        public static IEnumerable OrderBy(this IEnumerable source, string propertyName, bool desc = false)
        {
            if (source == null) throw new ArgumentNullException("source");
            if (string.IsNullOrEmpty(propertyName)) return source;

            var item = Expression.Parameter(typeof(T), "item");
            var prop = Expression.Property(item, propertyName);

            var keySelector = Expression.Lambda(prop, item);

            var param = Expression.Parameter(typeof(IEnumerable), "source");
            var orderBy = Expression.Call(typeof(Enumerable), (desc ? "OrderByDescending" : "OrderBy"), new[] { typeof(T), prop.Type }, param, keySelector);

            var sorter = Expression.Lambda, IEnumerable>>(orderBy, param);

            return sorter.Compile()(source);
        }

使用方法:

        public class Student
        {
            public string Name { get; set; }
            public int Age { get; set; }

            public Student(string name, int age)
            {
                this.Name = name;
                this.Age = age;
            }

            public override string ToString()
            {
                return string.Format("Name:{0}\t Age:{1}", this.Name, this.Age);
            }
        }

        static void Main(string[] args)
        {

            List list = new List
            {
                new Student("张三",13),
                new Student("李四",15),
                new Student("王五",14)
            };

            var sortList = list.OrderBy("Age");

            foreach (var item in sortList)
            {
                Console.WriteLine(item.ToString());
            }

            Console.WriteLine("\nDesc:\n");

            var sortList2 = list.OrderBy("Age", true);

            foreach (var item in sortList2)
            {
                Console.WriteLine(item.ToString());
            }
        }
时间: 2024-10-29 19:10:44

通过Expression 动态实现IEnumerable<T> CustomOrderBy的相关文章

EF增删改查+使用Expression进行排序分页

注:以下部分来自<ASP.NET MVC 企业级实战>一书的摘抄和改写以及部分个人学习心得. EF简单增删改查 增加 public static int Add() { using (NorthwindEntities db=new NorthwindEntities()) { Customers cs2 = new Customers { CustomerID = "11", ContactName="aa4444sa", Address="

Expression构建DataTable to Entity 映射委托

1 namespace Echofool.Utility.Common { 2 using System; 3 using System.Collections.Generic; 4 using System.Data; 5 using System.Linq.Expressions; 6 using System.Reflection; 7 using System.Reflection.Emit; 8 9 public class DataTableUtility { 10 11 publi

Expression 核心操作符、表达式、操作方法 【转】

一.Expression中的操作运算符  成员名称 说明  Add 加法运算,如 a + b, ,不进行溢出检查,针对数值操作数. AddAssign 加法复合赋值运算,如 (a += b), ,不进行溢出检查,针对数值操作数. AddAssignChecked 加法复合赋值运算,如 (a += b), ,进行溢出检查,针对数值操作数. AddChecked 加法运算,如 (a + b), ,进行溢出检查,针对数值操作数. And 按位或逻辑 AND 操作,如 (a & b) 在 C# 和 (a

动态生成lambda表达式

//1.0 获取我的申请单 int uid = UserMgr.GetCurrentLoginUser().uID; //2.0 获取参数 string kname = f["kname"]; string status = f["status"]; //第一个条件: var query= c => c.fCreatorID == uid //定义出一个c的参数,它的类型为wfReqeustForm var ps = Expression.Parameter(

静态和动态断言调试

写程序的时候经常需要调试,下面给出静态和动态断言调试以及常用的内置宏. 内置宏: __FILE__//输出文件名 __LINE__//所在行 __DATE__//日期 __TIME__//时间 __FUNCTION__//函数名 static_assert( constant-expression, string-literal ); 静态断言是在编译时候用的,因此第一参数的值必须在编译的时候就能确定,比如长量.如果第二参数为提示信息.如果第一个参数的表达式值为假则在编译的时候会出错,并给出 第

C# IEnumerable&lt;T&gt;、IEnumerator&lt;T&gt;、List&lt;T&gt;、ArrayList、[]数组各各的区别

List <T>是ArrayList的泛型,ArrayList里边的数据类型是object,List <T>里边的是具体的某种类型. ArrayList类似于向量,可以存储不同的数据类型在一个数组里边(转换为了object). 一般使用的时候尽量使用List <T>,因为ArrayList存取都要进行一次转换(装箱.拆箱). []类型的数组类似于List <T>,不同的是[]是定长的,而List <T>是长度可变的数组. ICollection主

Reflection和Expression Tree解析泛型集合快速定制特殊格式的Json

很多项目都会用到Json,而且大部分的Json都是格式固定,功能强大,转换简单等,标准的key,value集合字符串:直接JsonConvert.SerializeObject(List<T>)就可以搞定了,但凡事并非千篇一律,比如有的时候我们需要的Json可能只需要value,不需要key,并且前后可能还需要辅助信息等等,那该怎么办呢?我所能想到的可能有两种方案,1.自定义跟所需json格式一样的数据结构model,然后用JsonConvert.SerializeObject(model)直

.NET深入解析LINQ框架1

1.LINQ简述 2.LINQ优雅前奏的音符 2.1.隐式类型 (由编辑器自动根据表达式推断出对象的最终类型) 2.2.对象初始化器 (简化了对象的创建及初始化的过程) 2.3.Lambda表达式 (对匿名方法的改进,加入了委托签名的类型推断并很好的与表达式树的结合) 2.4.扩展方法 (允许在不修改类型的内部代码的情况下为类型添加独立的行为) 2.5.匿名类型 (由对象初始化器推断得出的类型,该类型在编译后自动创建) 2.6.表达式目录树(用数据结构表示程序逻辑代码) 3.LINQ框架的主要设

开源工作流引擎 Workflow Core 的研究和使用教程

目录 开源工作流引擎 Workflow Core 的研究和使用教程 一,工作流对象和使用前说明 二,IStepBuilder 节点 三,工作流节点的逻辑和操作 容器操作 普通节点 事件 条件体和循环体 节点的异步或多线程 用于事务的操作 四,条件或开关 迭代 条件判断 节点并发 五,其它 开源工作流引擎 Workflow Core 的研究和使用教程 一,工作流对象和使用前说明 为了避免歧义,事先约定. 工作流有很多节点组成,一个节点成为步骤点(Step). 1,IWorkflow / IWork