动态Lambda进阶一
直接上代码:
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进阶一的更多相关文章
- SqlDataReader生成动态Lambda表达式
上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调用委托,省去了多次用反射带来的性能损失. 今天在对Sq ...
- 动态Lambda表达式打印HelloWorld
最近在用C#与数据库打交道.开发过程中采用了ORM模型(以前是纯sql玩法,复杂的逻辑用存储过程做). 为了能通过配置文件动态地查询字段,也就是说需要能这样写: db.AsQuery<T> ...
- Entity Framework 高性能 泛型缓存+动态Lambda
前言:自学CSharp挺长时间的了,这是我第一编博客,跟大家分享一下.如有不足地方请多多包涵,也欢迎大家提出更好的意见,下面开始进入正题. 一.泛型缓存 1.概念:1.泛型(泛型也是一种推断类型,从而 ...
- 生成动态Lambda表达式1
SqlDataReader生成动态Lambda表达式 上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调 ...
- c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy
1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...
- C# 构建动态Lambda表达式
做CURD开发的过程中,通常都会需要GetList,然而查询条件是一个可能变化的需求,如何从容对应需求变化呢? 首先,我们来设计一个套路,尝试以最小的工作量完成一次查询条件的需求变更 1.UI收集查询 ...
- Linq之Lambda进阶
目录 写在前面 系列文章 带有标准查询运算符的Lambda Lambda中类型推断 Lambda表达式中变量作用域 异步Lambda 总结 写在前面 上篇文章介绍了Lambda的基本概念以及匿名方法, ...
- EntityFramework使用动态Lambda表达式筛选数据
public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T ...
- 动态lambda 构建
var param = Expression.Parameter(typeof(T)); var datetime1 = Expression.Constant(dt1); var datetime2 ...
随机推荐
- cocos2d 游戏开发:Cocos2d v3 "hello world"+显示飞船
V3 RC4 版本号图片 显示一个飞船 将Chapter1中 SpaceCargoShip.png 文件 加入到项目里面. 代码在 init : CCSprite *spaceCargoShip = ...
- XCode所有版本
You can find the DMGs for Xcode and other development tools onhttps://developer.apple.com/downloads/ ...
- Windbg的gflags.exe -- Attach调试利器
有没有碰到过程序启动就因为异常直接crash?有没有碰到程序启动之后什么反应也没有?有没有碰到过程序启动之后去触发另一个进程失败?有没有碰到别人的程序调用了你的代码,出现问题以后,让你来调查,而你只有 ...
- 扯谈网络编程之自己实现ping
ping是基于ICMP(Internet Control Message Protocol)协议实现的.而ICMP协议是在IP层实现的. ping实际上是发起者发送一个Echo Request(typ ...
- SimpleWiFi模块评估板
SimpleWiFi评估套件,发货清单: 1.评估版一块. 2.专用WiFi天线一根. 3.配套电源一个. 单模块 是60元,链接如下: http://item.taobao.com/i ...
- DL动态载入框架技术文档
DL动态载入框架技术文档 DL技术交流群:215680213 1. Android apk动态载入机制的研究 2. Android apk动态载入机制的研究(二):资源载入和activity生命周期管 ...
- CodeForce 356A Knight Tournament(set应用)
Knight Tournament time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Unity学习笔记(二)——第一个Unity项目Hello Unity
保留版权,转载请注明出处:http://blog.csdn.net/panjunbiao/article/details/9318811 在这一篇文章里,参照宣雨松的<Unity 3D游戏开发& ...
- jquery关于表格隐藏和显示问题
1. 关于指定表格指定列隐藏显示 $(":checkbox[name*=month]").each(function(){ if(!$(this).attr("check ...
- yum 安装软件时报错
报错信息 Another app is currently holding the yum lock; waiting for it to exit 处理方法 rm -rf /var/run/yum. ...