动态生成具有嵌套属性的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> ...
随机推荐
- 意外的php之学习笔记
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gc_gongchao/article/details/37312039 什么是php? ph ...
- 修改文件MD5值
1.查看文件的MD5值 (1)下载MD5Checker http://getmd5checker.com/download.html 或者 链接: https://pan.baidu.com/s/1e ...
- python多进程并发和多线程并发和协程
为什么需要并发编程? 如果程序中包含I/O操作,程序会有很高的延迟,CPU会处于等待状态,这样会浪费系统资源,浪费时间 1.Python的并发编程分为多进程并发和多线程并发 多进程并发:运行多个独立的 ...
- webpack(7)-生产环境
development(开发环境) 和 production(生产环境) 这两个环境下的构建目标存在着巨大差异.在开发环境中,我们需要:强大的 source map 和一个有着 live reload ...
- E. Neko and Flashback
传送门: 题意:假定我们已知a[]={3,4,6,5,7}, 那么b[]通过min(a[i],a[i+1])得到 那么b[]={3,4,5,5}, c[]通过max(a[i],a[i+1])得到 c ...
- 22.C# 事件
1.事件的含义 事件和异常类似,它们都是由对象引发,我们可以提供代码处理它们.不同的是事件并没有使用try ..catch这样的代码来处理,而是要订阅事件,订阅的含义是提供一段事件处理代码,在事件发送 ...
- 7#Java基本语句语法
Java基本语句语法https://github.com/DuGuQiuBai/Java/blob/master/day03/day03%E6%80%BB%E7%BB%93.txt 1:位运算符(了解 ...
- FB面经Prepare: Friends Recommendation
有个getFriend() API, 让你推荐你的朋友的朋友做你的朋友,当然这个新朋友不能是你原来的老朋友 package fb; import java.util.*; public class R ...
- PAT (Basic Level) Practice (中文)1022 D进制的A+B
1022 D进制的A+B 输入两个非负 10 进制整数 A 和 B (≤2^30^−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输入在一行中依次给出 3 个整数 A.B 和 ...
- 【Maven Jenkins】No resource to compile 还有多少坑要踩。。。LongTimeNoSee
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ toptown-webservice-vcrs ---[INFO] N ...