C#表达式树的构建方式一种是通过lambda表达式,构建方式很简单Expression<Func<>> name=lambda;
Func<>有返回值的委托,系统自己包含的,可以直接调用。<>里边的最后一个参数为返回的参数类型。
下边是我的例子,有一个Users的实体类。传进去一个Users实体,返回一个bool值。
构建完成之后就是调用,表达式树Expressions的Complie()方法,结果为Func<>委托,给委托值就等于把值传给了lambda表达式中。
Console.ForegroundColor = ConsoleColor.Green; Expression<Func<Users, bool>> expr = o => o.Id == 0; Func<Users, bool> func = expr.Compile(); Users u = new Users() { Id = 1}; Console.WriteLine(func(u).ToString());
下边的一个例子是通过API构建的,我们再次创建上边那个lambda表达式。需要注意的是我们构建的时传的参数o.Id,这里用到了反射,首先看lambda表达式为o=>o.Id==0
在ParameterExpression中传进去一个o,参数类型为Users,在反射出Users的属性Id。
Expression<Func<Users, bool>> expre; ParameterExpression par1 = Expression.Parameter(typeof(Users),"o"); PropertyInfo pro = typeof(Users).GetProperty("Id",BindingFlags.Instance | BindingFlags.Public); MemberExpression mem = Expression.Property(par1, pro.Name); ConstantExpression con = Expression.Constant(0, typeof(int)); BinaryExpression bin = Expression.Equal(mem, con); expre = Expression.Lambda<Func<Users, bool>>(bin,new ParameterExpression[] { par1}); bool a = expre.Compile()(u); Console.WriteLine(a.ToString()); Console.Read();
运行结果为:False False
哎,只是一个简单的实现...................只是实现,没有什么优化之类的.........
加油吧。
更加麻烦的慢慢学,慢慢更新........
时间: 2024-11-12 05:45:26