zoukankan      html  css  js  c++  java
  • 条件表达式工具类

    internal class ParameterReplacer : ExpressionVisitor
    {
    public ParameterReplacer(ParameterExpression paramExpr)
    {
    this.ParameterExpression = paramExpr;
    }

    public ParameterExpression ParameterExpression { get; private set; }

    public Expression Replace(Expression expr)
    {
    return this.Visit(expr);
    }

    protected override Expression VisitParameter(ParameterExpression p)
    {
    return this.ParameterExpression;
    }
    }

    /// <summary>
    /// 条件表达式工具类
    /// </summary>
    public static class ExpressionPredicate
    {

    const string DEFAULT="candidate";
    /// <summary>
    /// 创建表达式
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static Expression<Func<T, bool>> Create<T>() { return f => true; }

    /// <summary>
    /// True表达式
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static Expression<Func<T, bool>> True<T>() { return f => true; }

    /// <summary>
    /// False表达式
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static Expression<Func<T, bool>> False<T>() { return f => false; }

    /// <summary>
    /// Not操作
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="expr"></param>
    /// <returns></returns>
    public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> expr)
    {
    var candidateExpr = expr.Parameters[0];
    var body = Expression.Not(expr.Body);

    return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
    }

    /// <summary>
    /// And操作
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="exp_left"></param>
    /// <param name="exp_right"></param>
    /// <returns></returns>
    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right)
    {
    var candidateExpr = Expression.Parameter(typeof(T), DEFAULT);
    var parameterReplacer = new ParameterReplacer(candidateExpr);

    var left = parameterReplacer.Replace(exp_left.Body);
    var right = parameterReplacer.Replace(exp_right.Body);
    var body = Expression.And(left, right);

    return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
    }

    /// <summary>
    /// Or操作
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="exp_left"></param>
    /// <param name="exp_right"></param>
    /// <returns></returns>
    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right)
    {
    var candidateExpr = Expression.Parameter(typeof(T), DEFAULT);
    var parameterReplacer = new ParameterReplacer(candidateExpr);

    var left = parameterReplacer.Replace(exp_left.Body);
    var right = parameterReplacer.Replace(exp_right.Body);
    var body = Expression.Or(left, right);

    return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
    }
    }

    或者

    public static class PredicateExtensions
    {
    public static Expression<Func<T, bool>> True<T>() { return f => true; }
    public static Expression<Func<T, bool>> False<T>() { return f => false; }
    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
    {
    var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
    return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters);
    }
    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
    {
    var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
    return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
    }
    }

  • 相关阅读:
    Unity调用Andriod相册,细节分享(对于《Unity头像上传功能实现 一》的细节分享)
    Unity头像上传功能实现 一(接在《Unity调用Andriod相册,细节分享》后)
    webstorm启动时遇到The JVM could not be started的解决方法
    win10安装mysql出现请键入 NET HELPMSG 3534 以获得更多的帮助。
    Docker与虚拟机性能比较
    IntelliJ IDEA如何将普通java项目变为web项目
    is not assignable to javax.servlet.Servlet
    javascript深入理解js闭包
    Idea当前文件编码转换方法
    idear Make Project时提示了很多错误,什么未结束的字符串子面量、非法的表达示开始
  • 原文地址:https://www.cnblogs.com/zhshlimi/p/5142696.html
Copyright © 2011-2022 走看看