• c# 生成表达式树 - 动态表达式帮助类


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Text;
    using System.Threading.Tasks;

    namespace Library
    {
        ///


        /// 动态表达式帮助类
        ///

        public class ExpressionHelper
        {
            ///
            /// 生成表达式树
            ///

            ///
            ///
            ///
            public static Expression> GenerateQueryExp(T searchModel) where T : class, new()
            {
                List mcList = new List();
                Type type = searchModel.GetType();
                ParameterExpression parameterExpression = Expression.Parameter(type, "x");
                var pros = type.GetProperties();
                foreach (var t in pros)
                {
                    var objValue = t.GetValue(searchModel, null);
                    if (objValue != null && t.Name != "isid")
                    {
                        Expression proerty = Expression.Property(parameterExpression, t);
                        ConstantExpression constantExpression = Expression.Constant(objValue, t.PropertyType);
                        if (t.PropertyType.Name != "Int32")
                            mcList.Add(Expression.Call(proerty, typeof(string).GetMethod("Contains"), new Expression[] { constantExpression }));
                    }
                }

                if (mcList.Count == 0)
                    return Expression.Lambda>(Expression.Constant(true, typeof(bool)), new ParameterExpression[] { parameterExpression });
                else
                    return Expression.Lambda>(MethodCall(mcList), new ParameterExpression[] { parameterExpression });
            }

            public static Expression MethodCall(List mcList) where T : MethodCallExpression
            {
                if (mcList.Count == 1) return mcList[0];
                BinaryExpression binaryExpression = null;
                for (int i = 0; i < mcList.Count; i += 2)
                {
                    if (i < mcList.Count - 1)
                    {
                        BinaryExpression binary = Expression.OrElse(mcList[i], mcList[i + 1]);
                        if (binaryExpression != null)
                            binaryExpression = Expression.OrElse(binaryExpression, binary);
                        else
                            binaryExpression = binary;
                    }
                }
                if (mcList.Count % 2 != 0)
                    return Expression.OrElse(binaryExpression, mcList[mcList.Count - 1]);
                else
                    return binaryExpression;
            }
        }
    }
     

  • 相关阅读:
    芯源&立创EDA训练营——无刷电机驱动
    提升技能,挑战自我——一站式在线题库小程序
    JavaEE——HttpServletResponse
    一分钟学会使用js读取上传图片文件
    关于js实现斐波那契数列的一些思考(递归、循环、尾递归优化)
    Rockchip RK3399 - USB触摸屏接口驱动
    〈西游记〉中所有插曲、主题曲
    【Django 笔记】第一个demo
    Spring Boot 中的过滤器 (Filter) 使用方案
    Dockerfile - USER 指令详解
  • 原文地址:https://blog.csdn.net/qqqqqqqqqq198968/article/details/127841333