0

我有以下内容:

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

我想删除参数,并使第一个成员成为子表达式的参数,所以我最终得到:

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

这需要适用于上述格式的任何表达式树,包括MemberExpressionMethodCallExpression以及任何其他Expression具有.Expression属性的表达式树。例如:

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

或者

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

我将如何优雅地实现这一目标?

谢谢

安德鲁

4

2 回答 2

1

你检查过 Metalinq和它的 EditableExpression 吗?

于 2009-06-15T18:44:36.813 回答
1

这个页面的类开始 然后撒上这段代码,我认为你有一个解决方案(测试的东西是我如何测试它,我认为它与你所做的几乎相同):

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);
    }
}
于 2009-06-15T18:47:49.383 回答