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

  • 相关阅读:
    c语言基础:L1-053 电子汪
    worthington细胞分离技术方法之如何使用酶?
    Java面试题:通过实例说明工厂模式和抽象工厂模式的用法,以及它们在解耦中的作用
    基于java+springboot+vue的幼儿园信息网站
    编译期的序列遍历
    【Linux开发】Linux中uboot的常用命令及环境变量大全
    dubbo-admin 无法显示元数据
    Vue项目实战之人力资源平台系统(四)路由模块
    [RoarCTF 2019]Easy Calc
    (Java数据结构)泛型
  • 原文地址:https://blog.csdn.net/qqqqqqqqqq198968/article/details/127841333