2010-05-12 41 views
1

以下是對Get name of property as a string的後續問題。如何從屬性訪問lambda中提取對象引用

給定一個方法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參考。

在此先感謝。

+0

有要調用這個使用反射,而不是編譯拉姆達一個原因:

您可以通過編輯它返回它的函數獲取對象?這似乎是您首先需要擁有者的唯一原因...... – 2010-05-12 20:53:08

+0

我是lambda新手的唯一原因:)我將如何使用lambda執行屬性訪問?我剛剛嘗試過(作爲猜測): var v = Expression.Lambda >(propertyLambda).Compile(); object o = v(); 但沒有得到一個可理解的結果。 – 2010-05-12 21:20:44

+0

Cool ... this works: object o = Expression.Lambda(propertyLambda.Body).Compile()。DynamicInvoke(); 感謝提示,亞當。 – 2010-05-12 21:35:33

回答

1

MemberExpression有一個名爲Expression的屬性,它是發生成員訪問的對象。

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

var someObject = getSomeObject(); 
+0

這真是太酷了,正是我所需要的,甚至在4分鐘之內。有時候我覺得自己正在參加星際迷航(Star Trek)劇集,當我卡住的時候我需要做的就是大聲喊叫:「電腦,什麼是...」:)謝謝布萊恩。 – 2010-05-12 20:56:00

+0

哈哈高興地幫忙。我碰巧有一個解決方案打開,其中我有代碼從表達式中提取屬性獲取器:-) – 2010-05-12 21:11:10