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();

どうすればこれをエレガントに達成できますか?

ありがとう

アンドリュー

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 に答える