2010-05-12 5 views
1

Get name of property as a string에 대한 후속 질문입니다. 속성 액세스 람다에서 객체 참조를 추출하는 방법

는 (오류가 간결함을 위해 생략 검사) 방법 푸를 감안할 때 : 나는 작업 정적 속성 케이스를 가지고 있지만 인스턴스 속성 경우 여기서 someObject에 대한 참조를 가져 오는 방법을 모르는

// 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); 
} 

.

미리 감사드립니다.

+0

당신이 반사를 사용하는 대신 람다를 컴파일이를 호출 할 이유가 있습니까 :

당신은 그것을 반환하는 함수를 컴파일하여 객체를 얻을 수 있나요? 그 첫 번째 장소에서 소유자가 필요 유일한 이유가 나타납니다 ... –

+0

유일한 이유는 내가 람다 초보 :) 나는 람다를 사용하여 속성 액세스를 어떻게 실행합니까? 방금 시도한 것 (추측) : var v = Expression.Lambda > (propertyLambda) .Compile(); 개체 o = v(); 하지만 이해할 수없는 결과를 얻지 못했습니다. –

+0

쿨 ...이 작동합니다 : 개체 o = Expression.Lambda (propertyLambda.Body) .Compile(). DynamicInvoke(); 힌트를 보내 주셔서 감사합니다, Adam. –

답변

1

MemberExpression에는 구성원 액세스가 발생하는 개체 인 Expression이라는 속성이 있습니다.

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

var someObject = getSomeObject(); 
+0

그것은 놀라 울 정도로 차갑고, 정확히 내가 필요로하는 것이 었습니다, 4 분 안에, 심지어. 때로는 내가 Star Trek 에피소드에있는 것처럼 느껴지고 내가 붙어있을 때해야 할 일은 "Computer, what is ..."입니다. :) Bryan에게 감사드립니다. –

+0

도와 드리겠습니다. 내가 코드에서 식 getter를 추출하는 솔루션을 열어 보았습니다 :-) –

관련 문제