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

对象初始化

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

  1. class Animal
  2. {
  3. public string Species { get; set; }
  4. public int Age;
  5. }
  6. public static void CreateMemberInitExpression()
  7. {
  8. NewExpression newAnimal = Expression.New(typeof(Animal));
  9. //利用反射获取类的成员信息,保存为反射成员信息 memberinfo
  10. System.Reflection.MemberInfo speciesMember = typeof(Animal).GetMember("Species")[0];
  11. System.Reflection.MemberInfo ageMember = typeof(Animal).GetMember("Age")[0];
  12.  
  13. //把数据绑定到成员上,相当于赋值 MemberAssignment继承MemberBinding
  14. MemberBinding speciesMemberBinding = Expression.Bind(speciesMember, Expression.Constant("horse"));
  15. MemberAssignment ageMemberBinding = Expression.Bind(ageMember, Expression.Constant(12));
  16.  
  17. // 表示一个表达式,该表达式初始化该对象的属性
  18. MemberInitExpression memberInitExpression = Expression.MemberInit(newAnimal,new[] { speciesMemberBinding, ageMemberBinding });
  19. //也可以这样写,后面参数都默认为数组 MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(Animal)), speciesMemberBinding, ageMemberBinding );
  20. Console.WriteLine(memberInitExpression.ToString());
  21.  
  22. // This code produces the following output:
  23. //
  24. // new Animal() {Species = "horse", Age = 12}
  25. }
  26. static void Main(string[] args)
  27. {
  28.  
  29. CreateMemberInitExpression();
  30.  
  31. }

集合类初始化

 Expression.ListInit、Expression.ElementInit

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

代码如下

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

属性

par.Name == "xiaoli"

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

  1. static void Main(string[] args)
  2. {
  3. ParameterExpression par = Expression.Parameter(typeof(People),"par");
  4. MemberExpression property = Expression.Property(par, "Name");
  5. BinaryExpression binary = Expression.Assign(property, Expression.Constant("xiaoming"));
  6. BinaryExpression eqb = Expression.Equal(property,Expression.Constant("xiaoli"));
  7.  
  8. }
  9.  
  10. public class People
  11. {
  12. public int Age { get; set; }
  13. public string Name { get; set; }
  14.  
  15. public int Id;
  16.  
  17. }

【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. Java对象栈上分配

    转自 https://blog.csdn.net/o9109003234/article/details/101365108 在学习Java的过程中,很多喜欢说new出来的对象分配一定在对上: 其实不 ...

  2. tep0.9.5支持自定义扩展request

    tep0.9.5更新了以下内容: 自定义request请求日志 Allure报告添加request描述 猴子补丁扩展request fixtures支持多层级目录 FastAPI替代Flask 升级t ...

  3. Ubuntu 14.04更换内核

    1:查看当前安装的内核 dpkg -l|grep linux-image 2:查看可以更新的内核版本: sudo apt-cache search linux-image 3:安装新内核 sudo a ...

  4. 1. flink 基础

    flink word count  程序 1. 数据集模式 pom.xml 文件 <?xml version="1.0" encoding="UTF-8" ...

  5. TypeScript入门文档

    typescript入门文档链接d地址:https://ts.xcatliu.com/basics/type-of-function.html 博主个人站点:www.devloper.top

  6. JavaBeginnersTutorial 中文系列教程·翻译完成

    原文:JavaBeginnersTutorial 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 学习资源 目录 ...

  7. AT2400 [ARC072B] Alice&Brown

    通过打表后可以发现,当初始石头数 \(|X - Y| \le 1\) 时先手必败否则先手必胜. 我们考虑使用归纳证明这个结论,显然 \((1, 0), (1, 1)\) 时是成立的. 基于观察,我们可 ...

  8. java - HashMap原理及实现 (转)

    众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry.这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干. HashMap ...

  9. webpack打包如何统一js和css中图片资源路径

    目前项目应用的是vue-cli,自行修改了部分配置.三个环境的情况跟你差不多,测试/生产环境的层级比你还深. 先说下修改了哪些配置 1-build/utils.js下的cssLoaders内的gene ...

  10. MySQL数据类型的最优选择

    MySQL数据类型的最优选择   慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下:            ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下)      ● 计算.进而 ...