动态生成具有嵌套属性的linq选择(select)
class SelectItem
{
public string Item { get; set; }
}
class SelectList
{
public int ID { get; set; }
public string Name { get; set; }
public SelectItem Item { get; set; }
}
class SelectListDto : SelectList
{ } static Func<SelectList, SelectListDto> Test()
{
var entityType = typeof(SelectList);
var selectListDtoType = typeof(SelectListDto);
var selectItemType = typeof(SelectItem);
var entityIDProperty = entityType.GetProperty("ID");
var entityNameProperty = entityType.GetProperty("Name");
var entityItemProperty = entityType.GetProperty("Item");
var entityItemItemProperty = entityItemProperty.PropertyType.GetProperty("Item");
var selectListDtoIDProperty = selectListDtoType.GetProperty("ID");
var selectListDtoNameProperty = selectListDtoType.GetProperty("Name");
var selectListDtoItemProperty = selectListDtoType.GetProperty("Item");
var selectListDtoItemItemProperty = selectListDtoItemProperty.PropertyType.GetProperty("Item"); var parameterExpression = Expression.Parameter(entityType);
var newInstantiationExpression = Expression.New(selectListDtoType); var idMemberExpression = Expression.Property(parameterExpression, entityIDProperty);
var nameMemberExpression = Expression.Property(parameterExpression, entityNameProperty);
var itemMemberExpression = Expression.Property(parameterExpression, entityItemProperty); var innerObjNew = Expression.New(selectItemType); var nestedItemMemberExpression = Expression.Property(itemMemberExpression, entityItemItemProperty); var idBinding = Expression.Bind(selectListDtoIDProperty, idMemberExpression);
var nameBinding = Expression.Bind(selectListDtoNameProperty, nameMemberExpression);
var nestedItemBinding = Expression.Bind(entityItemItemProperty, nestedItemMemberExpression); var nestedInit = Expression.MemberInit(innerObjNew, nestedItemBinding); var nestedBinding = Expression.Bind(entityItemProperty, nestedInit);
var bindings = new List<MemberAssignment>() { idBinding, nameBinding, nestedBinding}; var memberInitExpression = Expression.MemberInit(newInstantiationExpression, bindings); var lambda = Expression.Lambda<Func<SelectList, SelectListDto>>(memberInitExpression, parameterExpression);
return lambda.Compile();
}
参考地址:
https://stackoverflow.com/a/51764873
https://stackoverflow.com/a/31465017/7712266
https://docs.microsoft.com/zh-cn/dotnet/csharp/expression-trees
动态生成具有嵌套属性的linq选择(select)的更多相关文章
- 利用runtime动态生成对象?
利用runtime我们能够动态生成对象.属性.方法这特性 假定我们要动态生成DYViewController,并为它创建属性propertyName 1)对象名 NSString *class = @ ...
- Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解
废话不多说,本文将会层层深入给大家讲解如何动态的生成一个完整的界面. 本文内容: Java代码中动态生成View Java代码中动态设置View的位置,以及其他的属性 LayoutParams详解 一 ...
- Android 动态生成布局 (多层嵌套)
Android 除了能够载入xml文件,显示布局外,也能够代码生成布局,并通过setContentView(View view)方法显示布局.单独的一层布局,如一个主布局加一个控件(如Button\i ...
- 前端下拉框选择和动态生成调用div
进入到一个项目期中,一边做项目,一边学习其中用到的知识.这些知识都是零碎的,有数据库,有html,有js,还有django.趁周末时间,整理前面遇到过的前端相关的知识点. 下拉框选择 <html ...
- Java动态生成类以及动态添加属性
有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件. 那么技术实现支持:使用CGLib代理. 具体的实现步骤: 1.配置Maven文件: &l ...
- 动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据
动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据:由存储过程决定,如果编写的存储过程可以生成需要呈现的表格则直接绑定,否则要动态生成表格
- 根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案
原文:根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案 问题: C#中,想动态产生这么一个类: public class StatisticsData { public ...
- WPF 动态生成对象属性 (dynamic)
原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定 可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量 ...
- 动态生成html元素并为元素追加属性
动态生成HTML元素的方法有三种: 第一种:document.createElement()创建元素,再用appendChild( )方法将元素添加到指定节点 <!DOCTYPE html> ...
随机推荐
- Linux-004-解决 Tomcat 启动时提示 Insufficient space for shared memory file
今天在帮同事定位问题时,定位服务发现有服务无法访问,发现在 Linux 启动 tomcat 时,提示如下信息: 即服务提示共享内存空间不足,可以使用 -Djava.io.tmpdir 参数指定期本地临 ...
- 解决配置Windows Update失败问题
大家都清楚电脑总是需要更新一些补丁,不过,很多系统用户发现更新了补丁之后,开机会出现windows update更新失败的情况,提示“配置Windows Update失败,还原更改,请勿关闭计算机”信 ...
- tarjan算法(强连通分量 + 强连通分量缩点 + 桥(割边) + 割点 + LCA)
这篇文章是从网络上总结各方经验 以及 自己找的一些例题的算法模板,主要是用于自己的日后的模板总结以后防失忆常看看的, 写的也是自己能看懂即可. tarjan算法的功能很强大, 可以用来求解强连通分量, ...
- Java8(1)之Lambda表达式初步与函数式接口
Lambda表达式初步 介绍 什么是Lambda表达式? 在如 Lisp.Python.Ruby 编程语言中,Lambda 是一个用于表示匿名函数或闭包的运算符 为何需要lambda表达式? 在 Ja ...
- pdf下载速度
- Java实现RSA密钥对并在加解密、加签验签中应用的实例
一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...
- jmeter压测mysql报can not be represented as java.sql.Timestame错误解决方法
JDBC Request 测试mysql时报以下问题? jmeter报错信息: 解决方法: 在数据库url后拼接上字符串?characterEncoding=utf8&zeroDateTim ...
- Ubuntu16.04彻底删除PHP7.2
一.删除php的相关包及配置 apt-get autoremove php7* 二.删除关联 sudo find /etc -name "*php*" |xargs rm -rf ...
- 阿里云轻量级服务器上JDK及tomcat部署配置
先下载JDK和tomcat到本地 地址为http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html ht ...
- [Docker] sh: docker-compose: not found
有点坑爹,在使用 alpine 镜像的时候,明明在里面安装了docker-compose,/usr/local/bin/docker-compose也是存在的,却报 sh: docker-compo ...