IT技术学习网
IT技术学习网
您的位置: 主页 > 编程技术 > c# >

c#使用表达式树访问对象、类型及成员:获取对象和属性的值

2014-12-26 23:09 来源: cnblogs 阅读:

C# FAQ最新的随笔中再次提出了使用表达式树访问对象及其成员的问题,这次讨论的是如何获取对象和属性的值。(该博客两个月前曾提出使用表达式树访问对象、类型和成员,我在第一时间进行了翻译)

作者在这篇随笔中提出了一个方法,专门打印字符串的属性:

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方法,我们就可以直接得到它们的值。

c#使用表达式树访问对象、类型及成员:获取对象和属性的值
转载需注明出处:IT技术学习网 http://www.itjsxx.com/csharp/932.html

评论文章 c#使用表达式树访问对象、类型及成员:获取对象和属性的值
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
IT技术学习网 - 关于我们 - 联系我们 - 版权声明 - 网站地图