C#表达式树的两种构建----简单示例

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

C#表达式树的两种构建----简单示例的相关文章

找1~100之间素数的两种比较简单的方法

方法一:利用一个布尔类型的值的判断,优点想法更直接易懂 public static void main(String[] args) { for(int i=2;i<=100;i++){ boolean b=true; for(int n=2;n<i;n++){ if(i%n==0){ b=false; break; } } if(b==true){ System.out.print(i+"\t"); } } } 方法二:能被2和这个数本身以外的数整除的都不是素数.理解难但

JavaScript 算法应用: 遍历DOM树的两种方式

1 常见的DOM树结构: 2  DOM数遍历有两种方式: 3 广度优先代码: 4 深度优先遍历代码 原文地址:https://www.cnblogs.com/autoXingJY/p/9193600.html

窗体传值的两种实现方法示例

这两天看前辈的视频初识了窗体传值,于是自己跟着敲了两个Demo,方便以后复习.分享交流. 窗体传值的两种方法:1.通过属性构造方法传值 2.利用委托实现传值. 示例1:点击Form1中的按钮打开From2,点击Form2中的按钮改变窗体Form1的背景颜色. Form1的代码: 1 public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void but

C语言求最大公约数(两种最简单的算法实现)

第一种:用较小数的最大约数于较大数作求模元算 #include<stdio.h> /*     求两个数的最大公约数 */ int main(){     int a,b,max,min,i,result;     scanf("%d,%d",&a,&b);     printf("您输入的的值分别为%d,%d\n",a,b);          if(a>b){         max=a;         min=b;    

遍历树的两种方式的测试及比较

节点类: /**  * 节点类  */ public class TreeNode { /**  * 节点编号  */ public String id; /**  * 节点内容  */ public String text; /**  * 父节点编号  */ public String parentId; /**  * 孩子节点列表  */ //private Children children = new Children(); private List<TreeNode> childre

Pytorch两种构建网络的方法

版本:Pytorch 1.0  代码是在jupter中执行的. 导包: import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torchvision import datasets, transforms 设置超参: BATCH_SIZE = 512 # 大概需要2G的显存 EPOCHS = 20 # 总共训练批次 DEVICE = torch.dev

matlab的两种函数简单使用介绍

画图 函数方法调用 可以在此处查看所有变量的值

使用servletAPI三种方式简单示例

一.直接实现Action接口或集成ActionSupport类(推荐) public class HelloAction implements Action { @Override public String execute() throws Exception { Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");

Lambda表达式树构建(上)

概述 Lambda是C#常用的语句,采用委托等方式,来封装真实的代码块.Lambda其实就是语法糖,是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式.常用的方法有Where.Select.SelectMany.Aggregate等:语法结构SomeList.Where(p=>p.property==value),其中SomeList基础