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

  • 相关阅读:
    精选30个大模型高频面试题
    java 两种不同形式的树状菜单,层级菜单返回
    第一讲:如何使用go-client连接k8s
    使用 Guava Retry 优雅的实现重试机制
    水稻生物育种突破 国稻种芯-何登骥:功能性农业外源植物导入
    http中的Content-Type类型
    CesiumJS【Basic】- #024 加载webm文件(Primitive方式)
    幼儿安全消防知识教案
    vue问题记录
    Unity 踩坑记录 Rigidbody 刚体重力失效
  • 原文地址:https://blog.csdn.net/qqqqqqqqqq198968/article/details/127841333