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)的更多相关文章

  1. 利用runtime动态生成对象?

    利用runtime我们能够动态生成对象.属性.方法这特性 假定我们要动态生成DYViewController,并为它创建属性propertyName 1)对象名 NSString *class = @ ...

  2. Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解

    废话不多说,本文将会层层深入给大家讲解如何动态的生成一个完整的界面. 本文内容: Java代码中动态生成View Java代码中动态设置View的位置,以及其他的属性 LayoutParams详解 一 ...

  3. Android 动态生成布局 (多层嵌套)

    Android 除了能够载入xml文件,显示布局外,也能够代码生成布局,并通过setContentView(View view)方法显示布局.单独的一层布局,如一个主布局加一个控件(如Button\i ...

  4. 前端下拉框选择和动态生成调用div

    进入到一个项目期中,一边做项目,一边学习其中用到的知识.这些知识都是零碎的,有数据库,有html,有js,还有django.趁周末时间,整理前面遇到过的前端相关的知识点. 下拉框选择 <html ...

  5. Java动态生成类以及动态添加属性

    有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件. 那么技术实现支持:使用CGLib代理. 具体的实现步骤: 1.配置Maven文件: &l ...

  6. 动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据

    动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据:由存储过程决定,如果编写的存储过程可以生成需要呈现的表格则直接绑定,否则要动态生成表格

  7. 根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案

    原文:根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案 问题: C#中,想动态产生这么一个类: public class StatisticsData    {        public ...

  8. WPF 动态生成对象属性 (dynamic)

    原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量 ...

  9. 动态生成html元素并为元素追加属性

    动态生成HTML元素的方法有三种: 第一种:document.createElement()创建元素,再用appendChild( )方法将元素添加到指定节点 <!DOCTYPE html> ...

随机推荐

  1. python numpy库的基本内容

    import numpy as np np.getfromtxt("路径",delimiter = "," ,dtype = str)  #读取txt文件数据 ...

  2. Jenkins+Jmeter持续集成笔记(三:集成到Jenkins)

    上一篇笔记中已经实现了通过ant工具执行Jmeter测试脚本,并输出html格式测试报告到指定目录. 在本章中,将尝试把这个过程丢进jenkins去执行. 1.Jenkins全局工具配置 登录jenk ...

  3. 【长文】Google面试官分步解析自己泄漏前的面试题,超多干货和建议

    本文翻译自Google工程师/面试官Alex Golec的文章:Google Interview Questions Deconstructed: The Knight's Dialer:翻译:实验楼 ...

  4. Oracle 10.2.0.5升级至11.2.0.4

    参照MOS 官方文档Complete Checklist for Manual Upgrade to Oracle Database 11gR2 (11.2) (Doc ID 837570.1)一.升 ...

  5. 《linux就该这么学》第十七节课:第18,19,23章,mariadb数据库、PXE无人值守安装系统和openldap目录服务。

    第23章 (借鉴请改动) openldap数据的特点:1.短小.2.读取次数较多 上述说明: openLDAP服务端配置:     1.yum install -y openldap openldap ...

  6. python下载及安装

    1, 许多新学员不知道开始学Python需要安装什么,需要准备什么,特地写下这篇文档给一脸懵逼的新同学们作为指导文档. 2, 首先,学Python需要有一台电脑,这是必须的.老师的系统是windows ...

  7. 阿里负载均衡,配置中间证书问题(在starcom申请免费DV ssl)

    前提假如免费版相关证书都已经配置到位,但是微信小程序Android访问有问题,检测域名(https://www.myssl.cn/tools/check-server-cert.html)发现服务器缺 ...

  8. 原生js获取 一个dom元素距离页面可视区域的位置值 -- getBoundingClientRect

    getBoundingClientRect() 这个方法返回一个矩形对象,包含四个属性:left.top.right和bottom.分别表示元素各边与页面上边和左边的距离. var box=docum ...

  9. Ansible 批量管理Windows Server服务器

    Ansible批量管理Windows Server         Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具,  它用Python写成,类似于saltstack和Puppe ...

  10. Ubuntu 自动选择最快的镜像源

    通常情况下阿里云的镜像源(http://mirrors.aliyun.com/ubuntu/)用得比较多 但是也不排除因网络环境导致的某个镜像源访问慢问题 那么就可以配置为自动选择镜像源进行更新 修改 ...