如何从属性访问lambda中提取对象引用

时间:2010-05-12 20:37:03

标签: c# reflection properties

以下是Get name of property as a string的后续问题。

给定方法Foo(为简洁省略错误检查):

// Example usage: Foo(() => SomeClass.SomeProperty)
// Example usage: Foo(() => someObject.SomeProperty)
void Foo(Expression<Func<T>> propertyLambda)
{
    var me = propertyLambda.Body as MemberExpression;
    var pi = me.Member as PropertyInfo;
    bool propertyIsStatic = pi.GetGetMethod().IsStatic;
    object owner = propertyIsStatic ? me.Member.DeclaringType : ???;
    ...
    // Execute property access
    object value = pi.GetValue(owner, null);
}

我有静态属性的情况,但不知道如何在实例属性的情况下获得对someObject的引用。

提前致谢。

1 个答案:

答案 0 :(得分:1)

MemberExpression有一个名为Expression的属性,该属性是成员访问的对象。

您可以通过编译返回它的函数来获取对象:

var getSomeObject = Expression.Lambda<Func<object>>(me.Expression).Compile();

var someObject = getSomeObject();