public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public Location Location { get; set; }
}
public class Location
{
public int Row { get; set; }
public int Col { get; set; }
}using System;
using System.Linq.Expressions;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
object student = new Student
{
Id = 1,
Name = "zhang san",
Location = new Location
{
Row = 10,
Col = 20
}
};
VisitProperties<Student>(student);
}
/// <summary>
/// 对未知类型的对象的属性进行递归访问
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
static void VisitProperties<T>(object obj)
{
var type = obj.GetType();
var paraExpression = Expression.Parameter(typeof(T), "object");
foreach (var prop in type.GetProperties())
{
var 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);
var otherType = prop.PropertyType;
MemberExpression memberExpression = Expression.Property(paraExpression, prop);
//访问obj.otherObj里的所有公有属性
foreach (var 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>
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)); //打印出得到的属性值
}
}
}
采用表达式树(Expression Tree)对一个对象的属性进行“遍历”,布布扣,bubuko.com
采用表达式树(Expression Tree)对一个对象的属性进行“遍历”
原文:http://blog.csdn.net/kmguo/article/details/19975331