(精华)2020年8月11日 C#基础知识点 表达式目录树的使用

public static void Show()
        {
            {
                //-----------------------------表达式目录树和委托的比较--------------------------
                Func<int, int, int> func = (m, n) => m * n + 2; //匿名方法
                Expression<Func<int, int, int>> exp = (m, n) => m * n + 2;
                //声明一个表达式目录树
                //快捷方式的声明 数据结构;
                //类似于一个树形结构,描述不同变量和常量之间的关系  数据结构;  
                //表达式目录树:语法树,或者说是一种数据结构
                int iResult1 = func.Invoke(12, 23);
                //exp.Compile()=> 委托; 
                int iResult2 = exp.Compile().Invoke(12, 23); //12 * 23 +2  278

                //int iResult = func.Invoke(12, 13); 
                //Expression<Func<int, int, int>> exp1 = (m, n) =>
                //    {
                //        return m * n + 2;
                //    }; 不能有语句体,不能当做一个方法,不能有大括号,只能有一行代码 
            }
            {
                //----------------------手动拼装表达式目录树,不是用的lambda的快捷方式--------------
                {
                    //Expression<Func<int>> expression = () => 123 + 234; 
                    ConstantExpression left = Expression.Constant(123, typeof(int));
                    ConstantExpression right = Expression.Constant(234, typeof(int));
                    var plus = Expression.Add(left, right);
                    Expression<Func<int>> expression = Expression.Lambda<Func<int>>(plus, new ParameterExpression[0]);
                    int iResult = expression.Compile().Invoke();
                    int iResult1 = expression.Compile()();
                }
                {
                    // 更复杂一点的:
                    //Expression<Func<int, int, int>> expression = (m, n) => m * n + m + n + 2; 
                    ParameterExpression m = Expression.Parameter(typeof(int), "m");
                    ParameterExpression n = Expression.Parameter(typeof(int), "n");
                    ConstantExpression constant2 = Expression.Constant(2, typeof(int));
                    var multiply = Expression.Multiply(m, n);
                    var plus1 = Expression.Add(multiply, m);
                    var plus2 = Expression.Add(plus1, n);
                    var plus = Expression.Add(plus2, constant2);
                    Expression<Func<int, int, int>> expression = Expression.Lambda<Func<int, int, int>>(plus, new ParameterExpression[]
                    {
                        m,
                        n
                    });
                    int iResult = expression.Compile().Invoke(12, 10);

                }
                {
                    //Expression<Func<People, bool>> lambda = (x) => x.Id.ToString().Equals("5"); 
                    ParameterExpression x = Expression.Parameter(typeof(People), "x");
                    FieldInfo field = typeof(People).GetField("Id");
                    ConstantExpression constant5 = Expression.Constant("5");
                    var fieldExp = Expression.Field(x, field);
                    MethodInfo toString = typeof(int).GetMethod("ToString", new Type[] { });
                    MethodInfo equals = typeof(string).GetMethod("Equals", new Type[] { typeof(string) });
                    var tostringExp = Expression.Call(fieldExp, toString, new Expression[0]);
                    var equalsExp = Expression.Call(tostringExp, equals, new Expression[]
                      {
                         constant5
                      });
                    Expression<Func<People, bool>> expression = Expression.Lambda<Func<People, bool>>(equalsExp, new ParameterExpression[]
                    {
                           x
                    });
                    bool bResult = expression.Compile().Invoke(new People()
                    {
                        Id = 5,
                        Name = "德玛西亚"
                    });
                }
            }
            {
                //动态拼装Linq To Sql
                {
                    var DbSet = new List<People>().AsQueryable();
                    //Expression<Func<People, bool>> exp = a => a.Name.Contains("name") && a.NAccount.Contains("Admin"); 
                    Expression<Func<People, bool>> exp = null;
                    Console.WriteLine("用户输入个名称,为空就跳过");
                    string name = Console.ReadLine();
                    if (!string.IsNullOrWhiteSpace(name))
                    {
                        exp = a => a.Name.Contains(name); 
                        DbSet = DbSet.Where(a => a.Name.Contains(name));
                    }
                    Console.WriteLine("用户输入个账号,为空就跳过");
                    string account = Console.ReadLine();
                    if (!string.IsNullOrWhiteSpace(account))
                    {
                        exp = a => a.Account.Contains(account);
                        DbSet = DbSet.Where(a => a.Account.Contains(account));// 出现整个DBSet 暴露出来了,在使用的时候是非常危险
                    }
                    exp = a => a.Account.Contains(account) && a.Name.Contains(name);
                }
            }
        }

猜你喜欢

转载自blog.csdn.net/aa2528877987/article/details/107938717