使用Expression动态创建lambda表达式

2023-11-04

using System;
using System.Linq.Expressions;
using System.Reflection;

namespace Helper
{
    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=>false
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static Expression<Func<T, bool>> False<T>() 
        { 
            return p => false; 
        }

        /// <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 == 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, string 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
        /// </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, string 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>
        /// <typeparam name="T"></typeparam>
        /// <param name="column"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static Expression<Func<T, bool>> CreateGreaterThan<T>(string propertyName, string 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>
        /// <typeparam name="T"></typeparam>
        /// <param name="column"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static Expression<Func<T, bool>> CreateLessThan<T>(string propertyName, string 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>
        /// <typeparam name="T"></typeparam>
        /// <param name="column"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static Expression<Func<T, bool>> CreateGreaterThanOrEqual<T>(string propertyName, string 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>
        /// <typeparam name="T"></typeparam>
        /// <param name="column"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static Expression<Func<T, bool>> CreateLessThanOrEqual<T>(string propertyName, string 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.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, string 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>
        /// <typeparam name="T"></typeparam>
        /// <param name="column"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        private static Expression<Func<T, bool>> GetNotContains<T>(string propertyName, string 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);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Expression动态创建lambda表达式 的相关文章

随机推荐

  • 50-00-010-配置-kylin-2.6.0官网配置

    文章目录 1 视界 1 Kylin 配置 2 配置文件及参数重写 3 Kylin 配置文件 配置重写 项目级别配置重写 Cube 级别配置重写 MapReduce 任务配置重写 Hive 任务配置重写 Spark 任务配置重写 部署配置 部
  • linux下部分文件管理类基本命令汇总以及bash展开特性介绍

    一 文件管理类基本命令 1 1 表格汇总 今天要讲解的命令如下表所示 按照外部命令和内建命令做基本划分 内建命令列表 命令名字 基本说明 file 检测文件类型 cd 改变shell的工作目录 dirs 显示目录堆栈信息 popd 从堆栈中
  • macOS_Monterey_12.6_21G115可引导可虚拟机安装的纯净版苹果OS系统ISO镜像安装包免费下载

    现在网络上黑果系统出现了许多多合一的多功能版 不是说这些版本不好 只是小编个人觉得 操作系统就是用来使用的 黑果本来就是服务于一些非苹果机的苹果OS爱好者的 简洁稳定应该是首选 固小编毅然放弃那些多功能的豪华版镜像版 独宠我的纯净可引导安装
  • pyqt5重温入门教程:用Qt Designer设计UI

    程序员今晚不回家 抖音号 在开始教程之前 先简单地水几句 之前使用过pyqt5 但是好久没用了 现在因为有一个项目需要 所以在此重温一下 当然教程就不是像零基础那样手把手从安装开始了 这里简洁明了 直接上手操作 第一步 打开Designer
  • 某宝sign参数逆向分析

    说明 淘宝ajax获取数据的方式为jsonp请求 所以在chrome中使用xhr拦截请求中加密参数的方式拦截不到 解决办法 目前我使用的方法是 添加DOM断点的方法去监听页面元素的变化 同时使用charles去监听页面发送的请求 后面就是一
  • 简单粗暴而又很有效果的图片无损放大方法

    工作生活中我们都会碰到想要对图片进行无损放大的情况 比如说做电子相册视频啦 做PPT啦 做设计啦等等等等 但是我们又没有那么专业的技术 PS也能试着操作一下 但始终没法弄能自己想要的效果 我们该如何对图片进行快速的无损放大呢 用PhotoZ
  • uart_linux

    写串口程序 include
  • vue.js中props,watch深度监听对象时,对象新增或者删除属性值时深度监听失效

    使用 deep 选项时 仅会监听对象内部现有属性值的改变 不会监听对象属性的增加或删除操作 原因是 deep 选项仅能监听对象内部属性的改变 当对象新增或删除属性时 这些操作并不会触发属性内部变化引起的更新 解决方案1 this obj O
  • DTFD-MIL: Double-Tier Feature Distillation Multiple Instance Learning for WSI_论文笔记

    文章链接 https arxiv org pdf 2203 12081 pdf 一 摘要 多实例学习 MIL 在组织病理学全切片图像分类中的应用越来越广泛 然而 用于这一特定分类问题的MIL方法仍然面临着独特的挑战 特别是那些与小样本队列相
  • antd4 tree带搜索框的可编辑树实现(hooks+ts)

    需求背景 实现带搜索框的可编辑树 有以下功能在 1 搜索相关节点高亮 2 配合treeSelect规范数据处理 3 节点可添加和编辑 编辑可修改上级 4 节点可删除 5 移入显示编辑图标 0 带搜索框的树 默认数据 搜索exa后 搜索exa
  • c#中的queue和stack

    using System using System Collections 队列Queue的using引用 using System Collections Generic using System Linq using System Te
  • JAVA基础

    目录 1 数据类型 2 注释模式 3 进制 4 浮点数拓展 5 字符拓展 6 运算中不同类型的数据先转化同一类型然后进行运算 7 变量 8 运算符 9 包机制 1 数据类型 强类型语言 变量必须定义才能使用 public class Dem
  • 这几款软件,你千万别装

    目录 写在前面 一 鲁大师 旧版 二 360全家桶 三 2345全家桶 四 快压 结束语 写在前面 很多人都会在自己的电脑上装上Ghost Windows 其实这样并不好 虽然不用激活 但是也有很多的捆绑软件 今天我就为大家盘点一下哪些软件
  • Android8打印功能,[翻译]Android 8.1 默认打印服务的中间人攻击漏洞披露

    漏洞概述 Android 8 1引入了默认打印服务 默认打印服务 基于Mopria联盟在谷歌应用商店发布的免费应用 Mopria Print Service 因其缺乏验证 所以会导致中间人攻击并被拦截后续的打印作业 还会造成在使用潜在不安全
  • 简单易懂SpringBoot和Android上传和下载文件方案——采用URL

    上传思路 SpringBoot把文件保存在静态资源里 并且开启静态资源访问 数据库保存文件的URL地址 URL地址是一个字符串 Android采用OkHttp上传文件 下载思路 SpringBoot从数据库获取URL地址发送给Android
  • Flutter仿网易云音乐:播放界面

    写在前头 本来是要做一个仿网易云音乐的flutter项目 但是因为最近事情比较多 项目周期跨度会比较长 因此分几个步骤来完成 这是仿网易云音乐项目系列文章的第一篇 没有完全照搬网易云音乐的UI 借鉴了其中的黑胶唱机动画 先贴上项目地址 gi
  • FISCO BCOS 贡献者粱永普:联盟链要对区块链做减法

    当前联盟链平台在公有链的基础上 对共识机制做调整 去掉公有属性 使得准入可控 效率提升 这实际上是对区块链在做减法 但这是否足够呢 我们在应用中很快发现 联盟链的使用比较受限制 一条链基本上只能做一项业务 而且成员的扩展会面临很多问题 这个
  • 关于nginx配置负载均衡,nginx.conf配置文件正确,一直跳出nginx欢迎界面

    小编跟大家一样 明明配置文件正确 但就是一直跳出nginx欢迎界面 这个是我nginx的安装目录 我在这个目录下吧nginx conf修改配置 发现没用 于是我看了nginx启动命令 usr local nginx sbin nginx 我
  • Ubuntu搭建配置Nginx

    目录 一 安装Nginx 方式一 官方网址 http nginx org en download html 方式二 使用apt安装 二 启动Nginx 三 nginx配置文件介绍 1 nginx 文件结构 2 默认的配置 3 nginx的基
  • 使用Expression动态创建lambda表达式

    using System using System Linq Expressions using System Reflection namespace Helper public class LambdaHelper