直接上代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions; namespace ConsoleApplication1
{
public static class Extensions
{
public static Predicate<T> ToPredicate<T>(this Func<T, bool> source)
{
Predicate<T> result = new Predicate<T>(source);
return result;
}
} public class LambdaExtention<T>
{
/// <summary>
/// 表达式集合
/// </summary>
private List<Expression> m_lstExpression = null; /// <summary>
/// 参数
/// </summary>
private ParameterExpression m_Parameter = null; /// <summary>
/// 构造函数
/// </summary>
public LambdaExtention()
{
m_lstExpression = new List<Expression>();
m_Parameter = Expression.Parameter(typeof(T), "x");
} /// <summary>
/// 字符串Contains筛选
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void Contains(Expression<Func<T, object>> expProperty, object objValue)
{
Expression expRes = Expression.Call(GetMemberExpression(expProperty), typeof(string).GetMethod("Contains"),
Expression.Constant(objValue)); m_lstExpression.Add(expRes);
} /// <summary>
/// 等于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void Equal(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.Equal(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 等于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void Equal(string strProperty, object objValue)
{
var member = GetMemberExpression(strProperty);
Expression expRes = Expression.Equal(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 小于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void LessThan(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.LessThan(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 小于等于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void LessThanOrEqual(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.LessThanOrEqual(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 大于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void GreaterThan(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.GreaterThan(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 大于等于
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
public void GreaterThanOrEqual(Expression<Func<T, object>> expProperty, object objValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.GreaterThanOrEqual(member, Expression.Constant(objValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 为真方法
/// </summary>
/// <param name="expProperty">表达式属性</param>
/// <param name="objValue">值</param>
/// <param name="typeName">类名名称</param>
/// <param name="methodName">方法名称</param>
public void IsTureMethod(Expression<Func<T, object>> expProperty, object objValue, string typeName, string methodName)
{
Expression expRes = Expression.IsTrue(GetMemberExpression(expProperty), Type.GetType(typeName).GetMethod(methodName)
); m_lstExpression.Add(expRes);
} /// <summary>
/// 获得Lambda
/// </summary>
/// <returns>返回Lambda</returns>
private LambdaExpression GetLambda()
{
Expression whereExpr = null; foreach (var expr in this.m_lstExpression)
{
if (whereExpr == null)
{
whereExpr = expr;
}
else
{
whereExpr = Expression.And(whereExpr, expr);
}
} if (whereExpr == null)
{
return null;
} return Expression.Lambda(whereExpr, m_Parameter);
} /// <summary>
/// 获得谓词
/// </summary>
/// <returns>返回谓词</returns>
public Predicate<T> GetPredicate()
{
Func<T, bool> match = (Func<T, bool>)GetLambda().Compile(); return match.ToPredicate();
} /// <summary>
/// 获得方法
/// </summary>
/// <returns>返回方法</returns>
public Func<T, bool> GetFunc()
{
Func<T, bool> match = (Func<T, bool>)GetLambda().Compile(); return match;
} /// <summary>
/// 获得MemberExpression
/// </summary>
/// <param name="exp">表达式属性</param>
/// <returns>返回MemberExpression</returns>
private MemberExpression GetMemberExpression(Expression<Func<T, object>> exp)
{
var arrSplit = exp.Body.ToString().Split("(.)".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var strProperty = string.Join(".", arrSplit, , arrSplit.Length - );
MemberExpression member = GetMemberExpression(strProperty);
return member;
} /// <summary>
/// 获得MemberExpression
/// </summary>
/// <param name="strProperty">表达式属性</param>
/// <returns>返回MemberExpression</returns>
private MemberExpression GetMemberExpression(string strProperty)
{
MemberExpression member; if (strProperty.Contains('.'))
{
string[] aryProperty = strProperty.Split('.'); member = Expression.Property(m_Parameter, aryProperty[]); for (int i = ; i < aryProperty.Length; i++)
{
member = Expression.Property(member, member.Type, aryProperty[i]);
}
}
else
{
member = Expression.Property(m_Parameter, strProperty);
} return member;
}
}
}

调用示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<Student> lstStu = new List<Student>();
lstStu.Add(new Student() { No = "", Name = "zhangsan", Classes = new Classes() { ClassID = "" } });
lstStu.Add(new Student() { No = "", Name = "lisi", Classes = new Classes() { ClassID = "" } });
lstStu.Add(new Student() { No = "", Name = "wangwu", Classes = new Classes() { ClassID = "" } });
lstStu.Add(new Student() { No = "", Name = "maliu", Classes = new Classes() { ClassID = "" } }); var le = new LambdaExtention<Student>(); ////自定义方法
le.IsTureMethod(x => x.Classes.ClassID, "", "ConsoleApplication1.Test", "Show"); ////两种写法
le.Equal(x => x.Classes.ClassID, "");
le.Equal("Classes.ClassID", ""); List<Student> stu = lstStu.FindAll(le.GetPredicate()); foreach (var item in stu)
{
Console.WriteLine(item.No);
} Console.Read();
}
} static class Test
{
public static bool Show(string str)
{
return false;
}
}
}

文章引用自:http://blog.jobbole.com/99431/

动态Lambda进阶一的更多相关文章

  1. SqlDataReader生成动态Lambda表达式

    上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调用委托,省去了多次用反射带来的性能损失. 今天在对Sq ...

  2. 动态Lambda表达式打印HelloWorld

    最近在用C#与数据库打交道.开发过程中采用了ORM模型(以前是纯sql玩法,复杂的逻辑用存储过程做). 为了能通过配置文件动态地查询字段,也就是说需要能这样写: db.AsQuery<T> ...

  3. Entity Framework 高性能 泛型缓存+动态Lambda

    前言:自学CSharp挺长时间的了,这是我第一编博客,跟大家分享一下.如有不足地方请多多包涵,也欢迎大家提出更好的意见,下面开始进入正题. 一.泛型缓存 1.概念:1.泛型(泛型也是一种推断类型,从而 ...

  4. 生成动态Lambda表达式1

    SqlDataReader生成动态Lambda表达式 上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调 ...

  5. c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy

    1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...

  6. C# 构建动态Lambda表达式

    做CURD开发的过程中,通常都会需要GetList,然而查询条件是一个可能变化的需求,如何从容对应需求变化呢? 首先,我们来设计一个套路,尝试以最小的工作量完成一次查询条件的需求变更 1.UI收集查询 ...

  7. Linq之Lambda进阶

    目录 写在前面 系列文章 带有标准查询运算符的Lambda Lambda中类型推断 Lambda表达式中变量作用域 异步Lambda 总结 写在前面 上篇文章介绍了Lambda的基本概念以及匿名方法, ...

  8. EntityFramework使用动态Lambda表达式筛选数据

    public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T ...

  9. 动态lambda 构建

    var param = Expression.Parameter(typeof(T)); var datetime1 = Expression.Constant(dt1); var datetime2 ...

随机推荐

  1. iOS视图控制器之间delegate传值教程

    之前在StackOverFlow上看到一篇讲传值(segue传值和delegate传值)的文章,感觉讲的非常清晰,就将delegate部分翻译了一下.有兴趣能够看看. 原文: http://stack ...

  2. CacheHelper工具类的使用

    package com.bbcmart.util; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import ne ...

  3. BaiduMap_SDK_DEMO_3.0.0_for_Xamarin.Android_by_imknown

    2.4.2 已稳定, 同一时候已经放置到分支/Release 2.4.2了. 3.0.0 已开发完毕, 可是不推荐大家用于项目中, 请观望或者自己进一步调试. 个人感觉尽管3.0.0简化了开发, 可是 ...

  4. NGUI使用教程(3) 使用外部图片制作Atlas(图集)

    在实际操作之前有几个概念先弄清一下 Atlas:图集,把美术给你提供的素材,用 NGUI 的 Atlas Maker 工具.合成一张图片(准确的说,还同一时候生成了prefab.mat ). Spri ...

  5. cocos2d-x 消类游戏,类似Diamond dash 设计

    前几天刚刚在学习cocos2d-x,无聊之下自己做了一个类似Diamond dash的消类游戏,今天放到网上来和大家分享一下.我相信Diamond dash这个游戏大家都玩过,游戏的规则是这样的,有一 ...

  6. 谈Web应用系统的可维护性

           每一个软件开发人员都十分清楚, 当软件构建得越来越复杂时, 可维护性就成了一个很突出的问题. 如何在构造软件系统的过程中始终保持可控制的可维护性呢?          一. 整体组织   ...

  7. C:打印菱形(自己的方法)

    //-------------------*打印菱形*--------------------- int i,j,k; int n; printf("请输入一个奇数n:"); sc ...

  8. IntelliJ IDEA中怎样使用JUnit4

     背景 近期參与了一个Anroid医疗项目,当中项目底层有非常多基础类及通讯类,并且非常多涉及复杂的字节操作还有多线程同步及状态机处理.这种项目做一下TDD还是必要的,尽量项眼下期把风险减少一些. ...

  9. android旋转动画和平移动画具体解释,补充说一下假设制作gif动画放到csdn博客上

    先上效果图: 我这里用的是GifCam来制作的gif动画,能够在http://download.csdn.net/detail/baidu_nod/7628461下载, 制作过程是先起一个模拟器,然后 ...

  10. 循环多少次? 【杭电--HDOJ-1799】 附题+具体解释

    循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...