表达式:使用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

 

你可能感兴趣的:(api)