使用表达式树访问对象、类型及成员(下):获取对象和属性的值
2010-03-17 15:55
706 查看
C# FAQ最新的随笔中再次提出了使用表达式树访问对象及其成员的问题,这次讨论的是如何获取对象和属性的值。(该博客两个月前曾提出使用表达式树访问对象、类型和成员,我在第一时间进行了翻译)
作者在这篇随笔中提出了一个方法,专门打印字符串的属性:
结果为
String:Test
Length:4
但是这个方法局限性太强了,我在之前随笔中使用的那个SomeClass类就无法正确显示SomeClass的类型及其值了。于是我对其进行了改写:
引入了一个新的类型变量,让它来代替写死的String,这样对于任何类型,都可以打印它们的类型和成员的值,而无需任何多余的magic string。
当然,这篇文章的精彩之处在于
e.Compile()表示一个委托Func<T>,因此e.Compile()()表示一个T类型的对象。如果T是基元类型或者重写了ToString方法,我们就可以直接得到它们的值。
作者在这篇随笔中提出了一个方法,专门打印字符串的属性:
public static void PrintPropertyAndObject<T>(Expression<Func<T>> e) { MemberExpression member = (MemberExpression)e.Body; Expression strExpr = member.Expression; if (strExpr.Type == typeof(String)) { String str = Expression.Lambda<Func<String>>(strExpr).Compile()(); Console.WriteLine("String: {0}", str); } string propertyName = member.Member.Name; T value = e.Compile()(); Console.WriteLine("{0} : {1}", propertyName, value); }
string str = "Test"; PrintPropertyAndObject(() => str.Length);
结果为
String:Test
Length:4
但是这个方法局限性太强了,我在之前随笔中使用的那个SomeClass类就无法正确显示SomeClass的类型及其值了。于是我对其进行了改写:
public static void PrintPropertyAndObject<TPropertyType, TClassType>( Expression<Func<TPropertyType>> e) { MemberExpression member = (MemberExpression)e.Body; Expression classExpr = member.Expression; TClassType classType = Expression.Lambda<Func<TClassType>>(classExpr).Compile()(); Console.WriteLine("{0} : {1}", classType.GetType().Name, classType); string propertyName = member.Member.Name; TPropertyType value = e.Compile()(); Console.WriteLine("{0} : {1}", propertyName, value); }
引入了一个新的类型变量,让它来代替写死的String,这样对于任何类型,都可以打印它们的类型和成员的值,而无需任何多余的magic string。
当然,这篇文章的精彩之处在于
T value = e.Compile()();
e.Compile()表示一个委托Func<T>,因此e.Compile()()表示一个T类型的对象。如果T是基元类型或者重写了ToString方法,我们就可以直接得到它们的值。
相关文章推荐
- 使用表达式树访问对象、类型及成员(上):获取类型和成员的信息
- [翻译]使用表达式树获取对象、类型和成员的信息
- 使用表达式树和反射来访问对象属性的性能比较
- 反射机制的概述和字节码对象的获取方式 JavaBean的概述&BeanUtils的使用 反射操作构造方法、成员方法、成员属性
- 使用表达式树和反射来访问对象属性的性能比较
- C#--反射使用Start!-获取对象的字段/属性/方法/成员/构造方法
- 使用EL表达式分别获取 某个 web 域 中的对象,访问 javabean 的属性、访问 list 集合、访问 map 集合、访问数组
- JAVA进阶 面向对象程序设计——第4章 继承与多态【不同访问属性使子类在使用这些成员时不同】
- 按钮的基本使用(不能直接访问对象的 结构体属性 的成员变量\)
- 获取对象属性类型、属性名称、属性值的研究:反射和JEXL解析引擎
- 应用程序中的所有线程都可以访问方法中的公用字段。要同步对公用字段的访问,您可以使用属性替代字段,并使用 ReaderWriterLock 对象控制访问。为此,请按照下列步骤操作:
- JavaScript学习点滴—js对象的四种类型的属性、方法的访问
- 使用CryptoAPI获取证书扩展属性之四:“CRL分发点”和“颁发机构信息访问”
- 使用JS闭包控制对象属性访问范围
- 【C#高效编程50例】条目1:使用属性而不是可访问的数据成员
- ECMA object类型实例化、访问对象属性
- 【c++笔记七】教你使用"const类型的对象、成员函数"和"static类型的成员函数、变量"
- 初学Python的学习笔记9----面向对象编程(获取对象信息、实例属性和类属性)、面向对象高级编程(使用__slots__、使用@property)
- Tolua使用笔记五:lua中遍历访问c#的Dictionary类对象与枚举类型
- 运行时简单使用-->获取对象的属性(class_copyIvarList)