c#使用表达式树访问对象、类型及成员:获取对象和属性的值
网络整理 - 06-27
C# FAQ最新的随笔中再次提出了使用表达式树访问对象及其成员的问题,这次讨论的是如何获取对象和属性的值。(该博客两个月前曾提出使用表达式树访问对象、类型和成员,我在第一时间进行了翻译)
作者在这篇随笔中提出了一个方法,专门打印字符串的属性:
<T>> e) { )e.Body; Expression strExpr = member.Expression; )) { >>(strExpr).Compile()(); , str); } string propertyName = member.Member.Name; T value = e.Compile()(); , propertyName, value); } ; PrintPropertyAndObject(() => str.Length);结果为
String:Test
Length:4
但是这个方法局限性太强了,我在之前随笔中使用的那个SomeClass类就无法正确显示SomeClass的类型及其值了。于是我对其进行了改写:
public static void PrintPropertyAndObject<TPropertyType, TClassType>( <TPropertyType>> e) { )e.Body; Expression classExpr = member.Expression; TClassType classType = <TClassType>>(classExpr).Compile()(); , classType.GetType().Name, classType); string propertyName = member.Member.Name; TPropertyType value = e.Compile()(); , propertyName, value); }引入了一个新的类型变量,让它来代替写死的String,这样对于任何类型,都可以打印它们的类型和成员的值,而无需任何多余的magic string。
当然,这篇文章的精彩之处在于
T value = e.Compile()();e.Compile()表示一个委托Func<T>,因此e.Compile()()表示一个T类型的对象。如果T是基元类型或者重写了ToString方法,我们就可以直接得到它们的值。
c#使用表达式树访问对象、类型及成员:获取对象和属性的值