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

  • 相关阅读:
    腾讯云产品---mysql 逻辑备份大表以及手动恢复表数据实战
    基于24位Δ-ΣADC和FPGA的高精度数据采集系统开发
    【leetcode】【剑指offer Ⅱ】066. 单词之和
    黑客(网络安全)技术自学30天
    Python 测试框架unittest和pytest的优劣
    【洛谷题解/NOI2002】P2421/NOI2002荒岛野人
    libpqxx (PostgreSQL C++ API)——安装使用
    Axure RP美容美妆医美行业上门服务交互原型图模板源文件
    树莓派玩转openwrt软路由:12.OpenWrt安装MySQL
    团建游戏----超级明星反串模仿秀
  • 原文地址:https://blog.csdn.net/qqqqqqqqqq198968/article/details/127841333