【C#表达式树 七】 反射在表达式树中的应用 ListInitExpression
以下都是反射在表达式树中的应用
对象初始化
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的更多相关文章
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C#3.0新增功能10 表达式树 07 翻译(转换)表达式
连载目录 [已更新最新开发文章,点击查看详细] 本篇将介绍如何访问表达式树中的每个节点,同时生成该表达式树的已修改副本. 以下是在两个重要方案中将使用的技巧. 第一种是了解表达式树表示的算法,以 ...
- C#动态构建表达式树(三)——表达式的组合
C#动态构建表达式树(三)--表达式的组合 前言 在筛选数据的过程中,可能会有这样的情况:有一些查询条件是公共的,但是根据具体的传入参数可能需要再额外增加一个条件.对于这种问题一般有两种方法: a. ...
- 用lambda表达式树替代反射
本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作 ...
- 表达式树扩展 动态生成表达式树插件 Sy.ExpressionBuilder。
CURD中,基础查询我感觉还是很烦人的一个浪费时间的工作,我经历过远古时代的GetAll(string name,int age),这种方式写服务的时候真的是心中一万个草泥马飞过,后面逐渐的变成了传一 ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- 表达式树ExpressionTrees
简介 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等.你可以对表达式树中的代码进行编辑和运算.这样能够动态修改可执行代码.在不同数据库 ...
- C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
随机推荐
- Java对象栈上分配
转自 https://blog.csdn.net/o9109003234/article/details/101365108 在学习Java的过程中,很多喜欢说new出来的对象分配一定在对上: 其实不 ...
- tep0.9.5支持自定义扩展request
tep0.9.5更新了以下内容: 自定义request请求日志 Allure报告添加request描述 猴子补丁扩展request fixtures支持多层级目录 FastAPI替代Flask 升级t ...
- Ubuntu 14.04更换内核
1:查看当前安装的内核 dpkg -l|grep linux-image 2:查看可以更新的内核版本: sudo apt-cache search linux-image 3:安装新内核 sudo a ...
- 1. flink 基础
flink word count 程序 1. 数据集模式 pom.xml 文件 <?xml version="1.0" encoding="UTF-8" ...
- TypeScript入门文档
typescript入门文档链接d地址:https://ts.xcatliu.com/basics/type-of-function.html 博主个人站点:www.devloper.top
- JavaBeginnersTutorial 中文系列教程·翻译完成
原文:JavaBeginnersTutorial 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 学习资源 目录 ...
- AT2400 [ARC072B] Alice&Brown
通过打表后可以发现,当初始石头数 \(|X - Y| \le 1\) 时先手必败否则先手必胜. 我们考虑使用归纳证明这个结论,显然 \((1, 0), (1, 1)\) 时是成立的. 基于观察,我们可 ...
- java - HashMap原理及实现 (转)
众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry.这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干. HashMap ...
- webpack打包如何统一js和css中图片资源路径
目前项目应用的是vue-cli,自行修改了部分配置.三个环境的情况跟你差不多,测试/生产环境的层级比你还深. 先说下修改了哪些配置 1-build/utils.js下的cssLoaders内的gene ...
- MySQL数据类型的最优选择
MySQL数据类型的最优选择 慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下: ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下) ● 计算.进而 ...