一、ConstantExPRession:表示具有常量值的表達(dá)式。因為表達(dá)式應(yīng)用過程中,參數(shù)據(jù)多是 Expressions 類型,算是對常量值的一種包裝吧。 ConstantExpression使用比較簡單,如Expression constantExpr = Expression.Constant(100);二、MemberExpression:表示訪問字段或?qū)傩浴O鄬碚f也是一個比較簡單的表達(dá)式了,主要是對 字段或?qū)傩?的包裝

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 字段實(shí)例調(diào)用 Console.WriteLine("當(dāng)前用戶 姓名:{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表達(dá)式 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("當(dāng)前用戶 姓名:{0} 年齡 {1} 歲", user.Name, user.Age); #endregion //以上輸出 //當(dāng)前用戶 姓名:張三 年齡 20 歲 //********************************** //組合如 s => s.Name == "張三" 的表達(dá)式 //********************************** #region Lambda表達(dá)式 使用字段 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("當(dāng)前用戶 姓名:{0} 年齡 {1} 歲", user.Name, user.Age); #endregion //以上輸出 //(o.Name == "李四") //o => (o.Name == "李四") //當(dāng)前用戶 姓名:李四 年齡 23 歲 #region Lambda表達(dá)式 使用屬性 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("當(dāng)前用戶 姓名:{0} 年齡 {1} 歲", user.Name, user.Age); #endregion //以上輸出 //(o.Age == 36) //o => (o.Age == 36) //當(dāng)前用戶 姓名:王五 年齡 36 歲 Console.ReadLine(); } }}View Code
三、NewExpression :表示構(gòu)造函數(shù)調(diào)用。 如果調(diào)用的類是實(shí)例類,這個就非常有用,特別是在調(diào)用方法表達(dá)式時,MethodCallExpression的第一個參數(shù)如果是實(shí)例類,這要用NewExpression來創(chuàng)建一個實(shí)例對象調(diào)用其方法,靜態(tài)類時,用null。使用時, 用Expression.New(類型)就可以創(chuàng)建了。
四、MethodCallExpression:表示對靜態(tài)方法或?qū)嵗椒ǖ恼{(diào)用。 這個用是比較多,也在這系列中用的多,就不單獨(dú)舉例。
五、UnaryExpression :表示包含一元運(yùn)算符的表達(dá)式。如:

// -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
新聞熱點(diǎn)
疑難解答