• 表达式:使用API创建表达式树(6)


    一、ConstantExpression:表示具有常量值的表达式。因为表达式应用过程中,参数据多是 Expressions 类型,算是对常量值的一种包装吧。

      ConstantExpression使用比较简单,如Expression constantExpr = Expression.Constant(100);


    二、MemberExpression:表示访问字段或属性。相对来说也是一个比较简单的表达式了,主要是对 字段或属性 的包装

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Expressions;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            class MyUser
            {
                public string Name;
                public int Age { get; set; }
            }
    
            static void Main(string[] args)
            {
                MyUser user = new MyUser { Name = "马七", Age = 20 };
    
                #region  字段实例调用
                Console.WriteLine("当前用户 姓名:{0} 年龄 {1} 岁", user.Name, user.Age);
                MemberExpression mbExp = Expression.Field(Expression.Constant(user), "Name");
                Console.WriteLine(mbExp.ToString());
                Console.WriteLine(Expression.Lambda(mbExp).Compile().DynamicInvoke());
            #endregion
                //以上输出
                //value(ConsoleApplication2.Program+MyUser).Name
                //马七
    
                #region  Lambda表达式
                List<MyUser> users = new List<MyUser>();
                users.Add(new MyUser { Name = "张三", Age = 20 });
                users.Add(new MyUser { Name = "李四", Age = 23 });
                users.Add(new MyUser { Name = "王五", Age = 36 });
                users.Add(new MyUser { Name = "刘六", Age = 41 });
                user = users.Where(s => s.Name == "张三").FirstOrDefault();
                Console.WriteLine("当前用户 姓名:{0} 年龄 {1} 岁", user.Name, user.Age);
            #endregion
                //以上输出
                //当前用户 姓名:张三 年龄 20 岁
    
                //**********************************
                //组合如  s => s.Name == "张三"  的表达式
                //**********************************
                #region  Lambda表达式 使用字段
                ParameterExpression paramExpr = Expression.Parameter(typeof(MyUser), "o");
                MemberExpression namePropExpr = Expression.Field(paramExpr, "Name");  //字段
                BinaryExpression binExp = Expression.Equal(namePropExpr, Expression.Constant("李四"));
                LambdaExpression laExp = Expression.Lambda(binExp, paramExpr);
                Func<MyUser, bool> func = (Func<MyUser, bool>)laExp.Compile();
                user = users.Where(func).FirstOrDefault();
                Console.WriteLine(binExp.ToString());
                Console.WriteLine(laExp.ToString());
                Console.WriteLine("当前用户 姓名:{0} 年龄 {1} 岁", user.Name, user.Age);
                #endregion
                //以上输出
                //(o.Name == "李四")
                //o => (o.Name == "李四")
                //当前用户 姓名:李四 年龄 23 岁
    
    
                #region  Lambda表达式 使用属性
                namePropExpr = Expression.Property(paramExpr, "Age");
                binExp = Expression.Equal(namePropExpr, Expression.Constant(36));
                laExp = Expression.Lambda(binExp, paramExpr);
                func = (Func<MyUser, bool>)laExp.Compile();
                user = users.Where(func).FirstOrDefault();
                Console.WriteLine(binExp.ToString());
                Console.WriteLine(laExp.ToString());
                Console.WriteLine("当前用户 姓名:{0} 年龄 {1} 岁", user.Name, user.Age);
                #endregion
                //以上输出
                //(o.Age == 36)
                //o => (o.Age == 36)
                //当前用户 姓名:王五 年龄 36 岁
                Console.ReadLine();
    
            }
        }
    }
    View Code

    三、NewExpression :表示构造函数调用。

        如果调用的类是实例类,这个就非常有用,特别是在调用方法表达式时,MethodCallExpression的第一个参数如果是实例类,这要用NewExpression来创建一个实例对象调用其方法,静态类时,用null。使用时, 用Expression.New(类型)就可以创建了。

    四、MethodCallExpression:表示对静态方法或实例方法的调用。 这个用是比较多,也在这系列中用的多,就不单独举例。

    五、UnaryExpression :表示包含一元运算符的表达式。

     如:

         // -100
                UnaryExpression aiU1 = Expression.Negate(Expression.Constant(100));
                Console.WriteLine(aiU1.ToString());
    
                //Not(Ture)
                UnaryExpression aiU2 = Expression.Not(Expression.Constant(true));
                Console.WriteLine(aiU2.ToString());
    
                //() => 123456
                UnaryExpression aiU3 = Expression.Quote(Expression.Lambda( Expression.Constant(123456)));
                Console.WriteLine(aiU3.ToString());
    
                //(123456 As Nullable`1)
                UnaryExpression aiU4 = Expression.TypeAs(Expression.Constant(123456), typeof(int?));
                Console.WriteLine(aiU4.ToString());
    
                //Convert(123456)
                UnaryExpression aiU5 = Expression.Convert(Expression.Constant(123456), typeof(Int16));
                Console.WriteLine(aiU5.ToString());
                //+123456
                UnaryExpression aiU6 = Expression.UnaryPlus(Expression.Constant(123456));
                Console.WriteLine(aiU6.ToString());
    View Code
  • 相关阅读:
    3. VIM 系列
    2. VIM 系列
    2. 修复FFMPEG 复用 PAT、PMT发送间隔小于25ms的错误
    1. VIM 系列
    RESTful风格API
    APIview的使用
    1.DRF初始化
    Linux下的django项目02
    Linux下的django项目01
    1,web项目工作流程
  • 原文地址:https://www.cnblogs.com/athinker/p/3601931.html
Copyright © 2020-2023  润新知