zoukankan      html  css  js  c++  java
  • 使用Expression动态创建lambda表达式

    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);
    }
    }
    }

    原文链接:https://blog.csdn.net/yl2isoft/article/details/53196092

  • 相关阅读:
    吊打面试官系列:Redis 性能优化的 13 条军规大全
    Laravel 7.6 发布
    Laravel 8 新功能:使用 schema:dump 来加速 Migration 和测试
    php中常用的4种运行方式
    基于 Redis 的订阅与发布
    [ida]使用pycharm编写IDApython
    visual studio 配置使生成的pdb文件中包含所有符号
    D/B位、一致与非一致代码段、向下拓展的实验与总结
    [debug] CE指针扫描扫出来为空
    error LNK2019: 无法解析的外部符号 _main,该符号在函数___tmainCRTStartup 中被引用
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/10825504.html
Copyright © 2011-2022 走看看