表达式:使用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(); } } }
三、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());
有兴趣的请在QQ群中参与讨论、联系作者 QQ群名称:.Net 高效开发 ,QQ群号:747049962
也可发邮件至:azthinker@sina.com
GitHub的https://github.com/azthinker
开源中国 https://gitee.com/azthinker
也可发邮件至:azthinker@sina.com
GitHub的https://github.com/azthinker
开源中国 https://gitee.com/azthinker