2010-05-16 4 views
3

이 일 ...어떻게 깊은 특성 다음 코드를 감안할 때

class Program { 

    static void Main(string[] args) { 

     Foo foo = new Foo { Bar = new Bar { Description= "Martin" }, Name = "Martin" }; 

     DoLambdaStuff(foo, f => f.Name); 
     DoLambdaStuff(foo, f => f.Bar.Description); 

    } 

    static void DoLambdaStuff<TObject, TValue>(TObject obj, Expression<Func<TObject, TValue>> expression) { 

     // Set up and test "getter"... 

     Func<TObject, TValue> getValue = expression.Compile(); 

     TValue stuff = getValue(obj); 

     // Set up and test "setter"... 

     ParameterExpression objectParameterExpression = Expression.Parameter(typeof(TObject)), valueParameterExpression = Expression.Parameter(typeof(TValue)); 
     Expression<Action<TObject, TValue>> setValueExpression = Expression.Lambda<Action<TObject, TValue>>(
      Expression.Block(
       Expression.Assign(Expression.Property(objectParameterExpression, ((MemberExpression)expression.Body).Member.Name), valueParameterExpression) 
      ), objectParameterExpression, valueParameterExpression 
     ); 
     Action<TObject, TValue> setValue = setValueExpression.Compile(); 


     setValue(obj, stuff); 

    } 

} 

class Foo { 

    public Bar Bar { get; set; } 
    public string Name { get; set; } 

} 

class Bar { 

    public string Description{ get; set; } 

} 

나는 얕은 속성에 액세스하고 있기 때문에 DoLambdaStuff(foo, f => f.Name)에 대한 호출이 작품을 좋아하지만 DoLambdaStuff(foo, f => f.Bar.Description)에 대한 호출이 실패 할 수 있습니다 getValue 기능이 잘 작동의 나는 개체의 깊은 속성에 액세스하려고 시도하고 때문에 setValueExpression의 작성은 실패합니다.

아무도 내가 깊은 특성뿐만 아니라 얕은에 대한 setValueExpression을 만들 수 있도록 내가이를 수정하는 데 도움시겠습니까?

감사합니다.

답변

2

당신은 당신의 expression.Body 이미 설정하려는 속성을 나타내는된다는 사실을 활용해야합니다. 이것은 표현식에서 expression.Body를 왼쪽에 사용할 수 있음을 의미합니다.

+0

감사합니다. 이것은 정확히 내가 찾고 있었던 것 같습니다. –

관련 문제