采用表达式树(Expression Tree)对一个对象的属性进行“遍历”
来源:互联网 发布:网络借贷利息是多少 编辑:程序博客网 时间:2024/05/02 05:25
实体类:
public class Student { public int Id { get; set; } public string Name { get; set; } public string[] MultipleCareers { get; set; } public Location Location { get; set; } } public class Location { public int Row { get; set; } public int Col { get; set; } }
Program.cs代码:
class Program { private static void Main(string[] args) { object student = new Student { Id = 1, Name = "zhang san", MultipleCareers =new string[]{"教师","程序员","作家","画家"}, Location = new Location { Row = 10, Col = 20 } }; VisitProperties<Student>(student); } /// <summary> /// 对未知类型的对象的属性进行递归访问 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> private static void VisitProperties<T>(object obj) { Type type = obj.GetType(); ParameterExpression paraExpression = Expression.Parameter(typeof (T), "object"); foreach (PropertyInfo prop in type.GetProperties()) { Type propType = prop.PropertyType; //判断是否为基本类型或String //访问方式的表达式树为:obj =>obj.Property if (propType.IsPrimitive || propType == typeof (String)) { VisitProperty<T>(obj, prop, paraExpression, paraExpression); } else { //对于访问方式的表达式树为: obj=>obj.otherObj.Property。 Console.WriteLine("not primitive property: " + prop.Name); Type otherType = prop.PropertyType; MemberExpression memberExpression = Expression.Property(paraExpression, prop); //访问obj.otherObj里的所有公有属性 foreach (PropertyInfo otherProp in otherType.GetProperties()) { VisitProperty<T>(obj, otherProp, memberExpression, paraExpression); } } Console.WriteLine("--------------------------------"); } } /// <summary> /// 执行表达式树为: obj=>obj.Property 或 obj=>obj.otherObj.Property的计算 /// </summary> /// <param name="instanceExpression">最终访问属性的obj对象的表达式树的表示</param> /// <param name="parameterExpression">类型T的参数表达式树的表示</param> private static void VisitProperty<T>(Object obj, PropertyInfo prop, Expression instanceExpression, ParameterExpression parameterExpression) { Console.WriteLine("property name: " + prop.Name); MemberExpression memExpression = Expression.Property(instanceExpression, prop); //实现类型转换,如将Id的int类型转为object类型,便于下面的通用性 Expression objectExpression = Expression.Convert(memExpression, typeof (object)); Expression<Func<T, object>> lambdaExpression = Expression.Lambda<Func<T, object>>(objectExpression, parameterExpression); //打印表达式树 Console.WriteLine("expression tree: " + lambdaExpression); Func<T, object> func = lambdaExpression.Compile(); Console.WriteLine("value: " + func((T) obj)); //打印出得到的属性值 } }
运行结果如图:
0 0
- 采用表达式树(Expression Tree)对一个对象的属性进行“遍历”
- 采用表达式树(Expression Tree)对一个对象的属性进行“遍历”
- 采用表达式树(Expression Block)对一个对象的属性进行“遍历”
- 采用表达式树(Expression Block)对一个对象的属性进行“遍历”
- 采用Delegate对一个未知类型的对象进行"遍历"
- struts2对一些属性的使用和对session封装对象类型采用jstl技术的遍历(配图解)
- 采用动态代理的方式对一个类进行增强
- js遍历一个对象的所有属性
- [msdn]Expression Tree表达式目录树
- IE8对JS的数组,采用属性遍历的方法,解析不一样的地方:
- IE8对JS的数组,采用属性遍历的方法,解析不一样的地方:
- $.each遍历对象、数组的属性值并进行处理
- 遍历一个对象的属性名称和值到map中,然后进行URL地址的拼接
- C#中遍历对象实例的 属性/值 对
- C#中遍历对象实例的 属性/值 对
- 对象属性的遍历
- 遍历对象的属性
- 【java学习记录】3.采用面向对象的方法设计一个能对复数(Complex)进行加、减、乘法的简单运算的程序
- 求二叉树的最大叶子节点距离(递归)
- 快速获取Android应用包名和Activity名
- Android 6.0 屏幕亮度控制参数
- Mybatis[3]
- activiti工作流的web流程设计器整合视频教程 SSM和独立部署
- 采用表达式树(Expression Tree)对一个对象的属性进行“遍历”
- tcp协议和udp的区别
- 简单制作 macOS Sierra 正式版U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
- LeetCode 简单操作 | 136. Single Number
- 怕忘记,这是在stormzhang 的微信公众号扣来的,怕忘记,记录在这里
- 给AlertDialog设置外部不可点击
- Java中ArrayList和LinkedList区别
- CC2640R2F之SDK下载安装
- 比较实用的rxJava自动处理服务器错误码