LambdaHelper 通过反射调用Dal中方法是设置Lambda参数
来源:互联网 发布:双色球走势数据分析 编辑:程序博客网 时间:2024/06/06 05:12
由于程序中需要通过反射调用Dal中的public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)等方法,其中需要传递参数。
string propertyName = propertyInfoes[0].Name;LambdaExpression exp = Common.LambdaHelper.CreateEqual(ModelType, propertyName, propertyValue);//生成Lambda参数,是个LambdaExpression类型的表达式。object[] parametersLoad = new object[] { exp };//将表达式加入参数列表MethodInfo MethodInfo = DalType.GetMethod("LoadEntity");var resultInstanceModele = MethodInfo.Invoke(DalInstance, parametersLoad);
在网络上找到一个lambdaHelper基础上,增加了参数Type T的传送,用于动态创建的lambda表达式用于反射动态创建的对象方式时传递方法参数。在反射机制调用时,需要传递Lambda表达式作为参数,而且在调用该类产生Lambda表达式时只知道类型T的Type,例如知道 Type T=typeof(string)中的T,而没有string类型。
/// <summary> /// 2017-09-03 DrXue:在原有lambdaHelper基础上,增加了参数Type T的传送,用于动态创建的lambda表达式用于反射动态创建的对象方式时传递方法参数。在反射机制调用时,需要传递Lambda表达式作为参数,而且在调用该类产生Lambda表达式时只知道类型T的Type,例如知道 Type T=typeof(string)中的T,而没有string类型。 /// </summary> public class LambdaHelper { /// <summary> /// 创建lambda表达式:p=>true /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static Expression<Func<T, bool>> True<T>() { return p => true; } /// <summary> /// 创建lambda表达式:p=>true /// </summary> /// <param name="T"></param> /// <returns></returns> public static Expression True(Type T) { ParameterExpression parameter = Expression.Parameter(T, "p"); return Expression.Lambda(Expression.Constant(true), parameter); } /// <summary> /// 创建lambda表达式:p=>false /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static Expression<Func<T, bool>> False<T>() { return p => false; } /// <summary> /// 创建lambda表达式:p=>false /// </summary> /// <param name="T"></param> /// <returns></returns> public static Expression False(Type T) { ParameterExpression parameter = Expression.Parameter(T, "p"); return Expression.Lambda(Expression.Constant(false), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TKey"></typeparam> /// <param name="sort"></param> /// <returns></returns> public static Expression<Func<T, TKey>> GetOrderExpression<T, TKey>(string propertyName) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p"); return Expression.Lambda<Func<T, TKey>>(Expression.Property(parameter, propertyName), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName /// </summary> /// <param name="T"></param> /// <param name="propertyName"></param> /// <returns></returns> public static Expression GetOrderExpression(Type T, string propertyName) { ParameterExpression parameter = Expression.Parameter(T, "p"); return Expression.Lambda(Expression.Property(parameter, propertyName), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName == propertyValue /// </summary> /// <typeparam name="T"></typeparam> /// <param name="column"></param> /// <param name="value"></param> /// <returns></returns> public static Expression<Func<T, bool>> CreateEqual<T>(string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda<Func<T, bool>>(Expression.Equal(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName == propertyValue /// 参数propertyValue类型修改为object,在方法中判断具体类型。 /// </summary> /// <param name="T"></param> /// <param name="propertyName"></param> /// <param name="propertyValue"></param> /// <returns></returns> public static LambdaExpression CreateEqual(Type T, string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(T, "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda(Expression.Equal(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName != propertyValue /// </summary> /// <typeparam name="T"></typeparam> /// <param name="propertyName"></param> /// <param name="propertyValue"></param> /// <returns></returns> public static Expression<Func<T, bool>> CreateNotEqual<T>(string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda<Func<T, bool>>(Expression.NotEqual(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName != propertyValue /// </summary> /// <param name="T">泛型类型</param> /// <param name="propertyName">属性名称</param> /// <param name="propertyValue">属性值</param> /// <returns></returns> public static LambdaExpression CreateNotEqual(Type T, string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(T, "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda(Expression.NotEqual(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName > propertyValue /// </summary> /// <typeparam name="T"></typeparam> /// <param name="column"></param> /// <param name="value"></param> /// <returns></returns> public static Expression<Func<T, bool>> CreateGreaterThan<T>(string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName > propertyValue /// </summary> /// <param name="T"></param> /// <param name="propertyName"></param> /// <param name="propertyValue"></param> /// <returns></returns> public static Expression CreateGreaterThan(Type T, string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(T, "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda(Expression.GreaterThan(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName < propertyValue /// </summary> /// <typeparam name="T"></typeparam> /// <param name="column"></param> /// <param name="value"></param> /// <returns></returns> public static Expression<Func<T, bool>> CreateLessThan<T>(string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda<Func<T, bool>>(Expression.LessThan(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName < propertyValue /// </summary> /// <param name="T"></param> /// <param name="propertyName"></param> /// <param name="propertyValue"></param> /// <returns></returns> public static Expression CreateLessThan(Type T, string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(T, "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda(Expression.LessThan(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName >= propertyValue /// </summary> /// <typeparam name="T"></typeparam> /// <param name="column"></param> /// <param name="value"></param> /// <returns></returns> /// public static Expression<Func<T, bool>> CreateGreaterThanOrEqual<T>(string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda<Func<T, bool>>(Expression.GreaterThanOrEqual(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName >= propertyValue /// </summary> /// <param name="T"></param> /// <param name="propertyName"></param> /// <param name="propertyValue"></param> /// <returns></returns> public static Expression CreateGreaterThanOrEqual(Type T, string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(T, "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda(Expression.GreaterThanOrEqual(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName <= propertyValue /// </summary> /// <typeparam name="T"></typeparam> /// <param name="column"></param> /// <param name="value"></param> /// <returns></returns> public static Expression<Func<T, bool>> CreateLessThanOrEqual<T>(string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda<Func<T, bool>>(Expression.LessThanOrEqual(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName <= propertyValue /// </summary> /// <param name="T"></param> /// <param name="propertyName"></param> /// <param name="propertyValue"></param> /// <returns></returns> public static Expression CreateLessThanOrEqual(Type T, string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(T, "p");//创建参数p MemberExpression member = Expression.PropertyOrField(parameter, propertyName); ConstantExpression constant = Expression.Constant(propertyValue);//创建常数 return Expression.Lambda(Expression.LessThanOrEqual(member, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName.Contains(propertyValue) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="column"></param> /// <param name="value"></param> /// <returns></returns> private static Expression<Func<T, bool>> GetContains<T>(string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p"); MemberExpression member = Expression.PropertyOrField(parameter, propertyName); MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); ConstantExpression constant = Expression.Constant(propertyValue, typeof(string)); return Expression.Lambda<Func<T, bool>>(Expression.Call(member, method, constant), parameter); } /// <summary> /// 创建lambda表达式:p=>p.propertyName.Contains(propertyValue) /// </summary> /// <param name="T"></param> /// <param name="propertyName"></param> /// <param name="propertyValue"></param> /// <returns></returns> private static Expression GetContains(Type T, string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(T, "p"); MemberExpression member = Expression.PropertyOrField(parameter, propertyName); MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); ConstantExpression constant = Expression.Constant(propertyValue, typeof(string)); return Expression.Lambda(Expression.Call(member, method, constant), parameter); } /// <summary> /// 创建lambda表达式:!(p=>p.propertyName.Contains(propertyValue)) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="column"></param> /// <param name="value"></param> /// <returns></returns> private static Expression<Func<T, bool>> GetNotContains<T>(string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p"); MemberExpression member = Expression.PropertyOrField(parameter, propertyName); MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); ConstantExpression constant = Expression.Constant(propertyValue, typeof(string)); return Expression.Lambda<Func<T, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter); } /// <summary> /// 创建lambda表达式:!(p=>p.propertyName.Contains(propertyValue)) /// </summary> /// <param name="T"></param> /// <param name="propertyName"></param> /// <param name="propertyValue"></param> /// <returns></returns> private static Expression GetNotContains(Type T, string propertyName, object propertyValue) { ParameterExpression parameter = Expression.Parameter(T, "p"); MemberExpression member = Expression.PropertyOrField(parameter, propertyName); MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); ConstantExpression constant = Expression.Constant(propertyValue, typeof(string)); return Expression.Lambda(Expression.Not(Expression.Call(member, method, constant)), parameter); } }
阅读全文
0 0
- LambdaHelper 通过反射调用Dal中方法是设置Lambda参数
- C#通过反射调用泛型参数方法介绍
- java通过反射调用不同参数的方法
- PHP通过反射机制调用可变参数方法
- 如何通过反射调用方法?
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- java通过反射调用方法
- Java 通过反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- Java通过反射调用方法
- java.util.Date和java.sql.Date的区别及应用
- 安卓学习笔记(6)-控制ListView显示列表的数量
- 【洛谷】P1965 转圈游戏
- C程序内存布局
- JavaWeb学习总结(二)——Tomcat服务器学习和使用(一)
- LambdaHelper 通过反射调用Dal中方法是设置Lambda参数
- python学习之文件与文件系统(一)
- HNU OJ题库 1001B图像旋转问题
- Vue监听一个数组id是否与另一个数组id相同
- 7-34 任务调度的合理性(25 分)
- TCP协议简介
- JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)
- Codeforces 853A Planning 【贪心】
- BZOJ 4569 萌萌哒 (并查集)