以下都是反射在表达式树中的应用

对象初始化

Expression.MemberInit 反射获取成员(字段 或者属性),绑定数据,然后生成 成员表达式节点

 class Animal
{
public string Species { get; set; }
public int Age;
}
public static void CreateMemberInitExpression()
{
NewExpression newAnimal = Expression.New(typeof(Animal));
//利用反射获取类的成员信息,保存为反射成员信息 memberinfo
System.Reflection.MemberInfo speciesMember = typeof(Animal).GetMember("Species")[0];
System.Reflection.MemberInfo ageMember = typeof(Animal).GetMember("Age")[0]; //把数据绑定到成员上,相当于赋值 MemberAssignment继承MemberBinding
MemberBinding speciesMemberBinding = Expression.Bind(speciesMember, Expression.Constant("horse"));
MemberAssignment ageMemberBinding = Expression.Bind(ageMember, Expression.Constant(12)); // 表示一个表达式,该表达式初始化该对象的属性
MemberInitExpression memberInitExpression = Expression.MemberInit(newAnimal,new[] { speciesMemberBinding, ageMemberBinding });
//也可以这样写,后面参数都默认为数组 MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(Animal)), speciesMemberBinding, ageMemberBinding );
Console.WriteLine(memberInitExpression.ToString()); // This code produces the following output:
//
// new Animal() {Species = "horse", Age = 12}
}
static void Main(string[] args)
{ CreateMemberInitExpression(); }

集合类初始化

 Expression.ListInit、Expression.ElementInit

new List<string>() {
    "sam",
    "korn"
}

代码如下

//创建一个ListInitExpression表示集合初始化器
//示例:
string proner1 = "sam";
string proner2 = "korn"; MethodInfo add = typeof ( List<string> ).GetMethod ( "Add" );
//生成表达式:Add("sam")
var elm1 = Expression.ElementInit (add ,Expression.Constant ( proner1 ));
//生成表达式:Add("korn")
var elm2 = Expression.ElementInit (add ,Expression.Constant ( proner2 ));
//生成表达式:new List<string>( )
var list = Expression.New ( typeof ( List<string> ) );
//生成表达式:new List<string> { "sam" , "korn" }
var listObject = Expression.ListInit (list , elm1 , elm2); Console.WriteLine(listObject.ToString() );
Expression.ElementInit (add ,Expression.Constant ( proner2 ));  元素初始化 第一方法一定是Add,这个方法只能用于集合类

属性

par.Name == "xiaoli"

以上写成表达树节点式代码如下:

 static void Main(string[] args)
{
ParameterExpression par = Expression.Parameter(typeof(People),"par");
MemberExpression property = Expression.Property(par, "Name");
BinaryExpression binary = Expression.Assign(property, Expression.Constant("xiaoming"));
BinaryExpression eqb = Expression.Equal(property,Expression.Constant("xiaoli")); } public class People
{
public int Age { get; set; }
public string Name { get; set; } public int Id; }

【C#表达式树 七】 反射在表达式树中的应用 ListInitExpression的更多相关文章

  1. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  2. C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. C#3.0新增功能10 表达式树 07 翻译(转换)表达式

    连载目录    [已更新最新开发文章,点击查看详细] 本篇将介绍如何访问表达式树中的每个节点,同时生成该表达式树的已修改副本. 以下是在两个重要方案中将使用的技巧. 第一种是了解表达式树表示的算法,以 ...

  4. C#动态构建表达式树(三)——表达式的组合

    C#动态构建表达式树(三)--表达式的组合 前言 在筛选数据的过程中,可能会有这样的情况:有一些查询条件是公共的,但是根据具体的传入参数可能需要再额外增加一个条件.对于这种问题一般有两种方法: a. ...

  5. 用lambda表达式树替代反射

    本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作 ...

  6. 表达式树扩展 动态生成表达式树插件 Sy.ExpressionBuilder。

    CURD中,基础查询我感觉还是很烦人的一个浪费时间的工作,我经历过远古时代的GetAll(string name,int age),这种方式写服务的时候真的是心中一万个草泥马飞过,后面逐渐的变成了传一 ...

  7. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  8. 表达式树ExpressionTrees

    简介 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等.你可以对表达式树中的代码进行编辑和运算.这样能够动态修改可执行代码.在不同数据库 ...

  9. C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

随机推荐

  1. Cesium入门8 - Configuring the Scene - 配置视窗

    Cesium入门8 - Configuring the Scene - 配置视窗 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coini ...

  2. CTF web安全45天入门学习路线

    前言 因为最近在准备开发CTF学习平台,先做一个学习路线的整理,顺便也是对想学web的学弟学妹的一些建议. 学习路线 初期 刚刚走进大学,入了web安全的坑,面对诸多漏洞必然是迷茫的,这时的首要任务就 ...

  3. AOP操作-AspectJ配置文件

    AOP操作(AspectJ配置文件)(了解) (实际中大部分用注解方式) 1,创建两个类,增强类和被增强类,创建方法 2,在spring配置文件中创建两个类对象 3,在spring配置文件中配置切入点

  4. 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群

    本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...

  5. Ubuntu18.04 显卡驱动安装(解决各种疑难杂症)

    步骤 下载驱动 准备工作 进行安装 检查安装 下载驱动 首先我们需要去官网下载显卡驱动 打开浏览器,在百度搜索框中搜索:显卡驱动 下载 在手动搜索驱动程序一栏,根据自己的显卡进行选择 产品系列中,No ...

  6. 基于Itextpdf合成PDF

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/12023314.html 开发过程中有用到PDF合成, 记录一下合成的方法和代码. 使用工具 : ...

  7. C++实现对Json数据的友好处理

    背景 C/C++客户端需要接收和发送JSON格式的数据到后端以实现通讯和数据交互.C++没有现成的处理JSON格式数据的接口,直接引用第三方库还是避免不了拆解拼接.考虑到此项目将会有大量JSON数据需 ...

  8. linux 定时删除图以及crontab介绍

    执行 sudo crontab -e 0 3 1 * * /etc/letsencrypt/certbot-auto renew --renew-hook "sudo nginx -s re ...

  9. PHP+mysql真题

    PHP+mysql真题 来自<PHP程序员面试笔试宝典>,涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书. [真题215] 按要求写出SQL实现. ...

  10. Solution -「多校联训」签到题

    \(\mathcal{Description}\)   Link.   给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...