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

  • 相关阅读:
    [笔记]如何屏蔽视频网站的片头广告——优酷
    [翻译]JWA(JEDI Windows API Headers)库的readmefirst.txt文件翻译
    [代码]Delphi实现获取文件及文件夹大小(支持超过2G的大文件)
    [笔记]TrueCrypt7.0a代码编译流程 (已更新 TrueCrypt 7.2代码在Win8.1 64位下编译流程)
    学习一种编程语言必须要做的15个练习题(转发-收藏!)
    LoadRunner函数中文翻译系列之一Action
    软件配置项 的理解
    性能测试:压力测试、负载测试、并发测试、强度测试及容量测试之间的区别
    EF中使用泛型
    ASP.NET MVC 3.0 在各个版本IIS中的部署
  • 原文地址:https://www.cnblogs.com/zhshlimi/p/5142696.html
Copyright © 2011-2022 走看看