2009-06-15 7 views
0

У меня есть следующие:Выражение проблема модификации дерева

Expression<Func<Car, int>> myExpr = car => car.Wheel.Tyre.Pressure; 

Я хочу, чтобы удалить параметр, и сделать первый элемент параметра для подвыражении, поэтому я в конечном итоге с:

Expression<Func<Wheel, int>> mySubExpr = wheel => wheel.Tyre.Pressure; 

Это должно работать для любого дерева выражений в вышеуказанном формате, включая MemberExpression, MethodCallExpression и любые другие Expression, который имеет .Expression. Например:

Expression<Func<Car, int>> myOtherExpr = car => car.GetRearLeftWheel().GetTyre().Pressure 

или

Expression<Func<Car, int>> anotherExpr = car => car.Wheel.GetTyre().GetPressure(); 

Как бы достичь этого элегантно?

Благодаря

Andrew

ответ

1

Начать с классом от this page Затем посыпать в этом коде, и я думаю, что у вас есть решение (тест материал был, как я проверил это, я думаю, что это в значительной степени то же самое, что вы делали):

class Test 
{ 
    public Test() 
    { 
     Expression<Func<string, string>> trim2 = s => s.Substring(1).Substring(1); 
     var modifier = new PopModifier(); 
     Expression<Func<string, string>> trim1 = (Expression<Func<string, string>>)modifier.Modify(trim2); 

     var test2 = trim2.Compile(); 
     var test1 = trim1.Compile(); 
     var input = "abc"; 
     if (test2(input) != "c") 
     { 
      throw new Exception(); 
     } 
     if (test1(input) != "bc") 
     { 
      throw new Exception(); 
     }   
    } 
} 

public class PopModifier : ExpressionVisitor 
{ 
    bool didModify = false; 

    public Expression Modify(Expression expression) 
    { 
     return Visit(expression); 
    } 

    protected override Expression VisitMethodCall(MethodCallExpression m) 
    { 
     if (!didModify) 
     { 
      didModify = true; 
      return m.Object; 
     } 

     return base.VisitMethodCall(m); 
    } 
} 
+0

спасибо, я постараюсь в ближайшее время –

1

ли вы проверить Metalinq и его EditableExpression?

+0

no i havent, но если это даже половина приличного ive, то для него миллион использует, и это будет волновать. спасибо –

Смежные вопросы