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

对象初始化

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. django-环境搭建-开使hello world!

    django的环境安装非常简单,只需用pip安装一个django库就可以了,编辑器选择pycharm pip install django==2.1.2 查看版本号:pip show django C ...

  2. golang中channel

    1. Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication). 2. select package main im ...

  3. 介绍一个golang库:fastcache

    学习VictoriaMetrics源码的时候发现,VictoriaMetrics的缓存部分,使用了同一产品下的fastcache.下面分享阅读fastcache源码的的结论: 1.官方介绍 fastc ...

  4. 删除修改docker网络环境

    安装工具包 yum install bridge-utils -y 设置docker0 ip网段 ip link set docker0 down brctl delbr docker0 brctl ...

  5. pwnkit漏洞分析-CVE-2021-4034

    研究了一下前段时间的Polkit提权漏洞,里面有很多以前不知道的技巧.漏洞很好用,通杀CENTOS.UBUNTU各版本. 主要是分析这个POC触发原理.POC如下: /* * Proof of Con ...

  6. 计算机网络再次整理————tcp例子第二前奏[四]

    前言 前文我们介绍了网络协议的各层,同时也介绍了一下我们在编写代码时候的服务端的accept.bind.listen.connect.send做了什么. 可以说是从宏观的角度,或者代码开发的角度来说的 ...

  7. [USACO18DEC]Balance Beam P

    根据题意不难发现这个模型是不好进行贪心的,于是可以考虑使用 \(dp\).可以令 \(dp_i\) 表示在 \(i\) 位置以最优策略能获得的报酬期望值,那么会有转移: \[dp_i = \max(f ...

  8. 设置程序启动时加载的storyboard

    这个设置表明:程序启动时会加载Main.storyboard

  9. tabbar选中按钮的标题颜色和字体

    @implementation XMGTabBarController /* 问题: 1.选中按钮的图片被渲染 -> iOS7之后默认tabBar上按钮图片都会被渲染 1.修改图片 2.通过代码 ...

  10. kubeadm/flannel/dashboard/harbor部署以及服务发布

    kubeadm/flannel/dashboard/harbor部署以及服务发布 目录 kubeadm/flannel/dashboard/harbor部署以及服务发布 一.部署kubeadm 1. ...