2010-07-16 2 views
1

개체 그래프의 속성을 가리키는식이 주어지면 그 그래프가있는 속성을 소유 한 인스턴스를 검색하려고합니다. 나는 고군분투하고있다. 람다 파라미터 범위식 트리를 사용하여 속성을 소유 한 개체를 탐색하고 반환하십시오.

[Test] 
    public void TestExpression() 
    { 
     var person = new Person {Address = {Street = "Bank Street"}, Name = "Joe"}; 

     Expression<Func<Person, object>> exp = p => p.Address.Street; 
     Assert.AreEqual("Bank Street", exp.Compile().Invoke(person)); 

     var owner = GetPropertyOwner(person, exp); 
     Assert.AreEqual(owner, person.Address); 
    } 

    private object GetPropertyOwner<T>(T root, Expression<Func<T, object>> exp) 
    { 
     if (exp.Body is MemberExpression) 
     { 
      var member = exp.Body as MemberExpression; 
      if (member.Expression is MemberExpression) 
      { 
       var parentMember = member.Expression as MemberExpression; 
       //parent member will be {p.Address} 
       //Now I'm trying to reconstruct an expression that I can combile 
       var parameterExpression = System.Linq.Expressions.Expression.Parameter(typeof(T), "p"); 
       var lambdaExpression = System.Linq.Expressions.Expression.Lambda(parentMember, parameterExpression); 
       //Next Linethrows System.InvalidOperationException : Lambda Parameter not in scope 
       var found = lambdaExpression.Compile().DynamicInvoke(person); 
       return found; 
      } 
     } 

     return new object(); 
    } 

답변

2

ParameterExpression 개체하지 이름 참조 평등으로 비교하지 그래서 lambdaExpression 걸리는 "P"파라미터 것과 동일하지 않다 : 현재 코드는 저 System.InvalidOperationException을 준다 parentMember에 사용됩니다. 새 람다를 만들 때 동일한 ParameterExpression 인스턴스를 사용해야합니다. 시도 :

var parameterExpression = exp.Parameters[0]; 
+0

굉장! 나는 그 해결책을 붙여 넣기 만하면된다. 내가하지 않으면 붙어 있지 않았을 것입니다. 감사 – Max