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

 

posted @ 2014-03-15 13:40  Tikyang  阅读(417)  评论(0编辑  收藏  举报