2016-03-31 4 views
0

Ich habe zwei Ausdruck mit Expression.And kombiniert. Wie kann ich diesen neuen Ausdruck mit tatsächlichen Werten kompilieren?Completing C# Ausdruck mit Werten

var expr1 = Expression.Equal(Expression.Parameter(typeof(int), "param1"), Expression.Parameter(typeof(int), "param2")); 
var expr2 = Expression.Equal(Expression.Parameter(typeof(int), "param3"), Expression.Parameter(typeof(int), "param4")); 
var finalExpression = Expression.And(expr1, expr2); 

Ich versuche nach substiting die Parameter mit Werten

bool returnBool = Expression.Lambda<Func<bool>>(finalExpression).Compile()(); 

Antwort

2

Sie zu bekommen somoething wie dies funktioniert muss es einem Lambda mit den gleichen Parametern kompilieren:

var lambda = Expression.Lambda<Func<int, int, int, int, bool>>(
    finalExpression, param1, ...).Compile(); 
lambda(1, 2, 3, 4); 

Beachten Sie, dass Sie die im Ausdruck verwendeten Expression.Parameter() Instanzen an Lambda() übergeben müssen.

1

Wenn Sie die Parameter durch Konstanten ersetzen möchten, können Sie dies mit einem ExpressionVisitor tun, wobei alle Instanzen der Parameter durch Expression.Constant ersetzt werden. Dann können Sie den Lambda zu einem Typ ohne die Parameter zusammenstellen. Alternativ können Sie ein Lambda bauen, das beinhaltet das andere Lambda - nicht an einem PC, aber es ist Expression.Invoke oder Expression.Call - im Grunde funktioniert es wie ein Unter-Anruf.

+0

Danke Marc Gravell. Ich akzeptiere @SLaks Antwort, aber ich würde wahrscheinlich am Ende mit ExpressionVisitor später für eine bessere Lösung –

+0

@ManojSreekumar kein Problem; und ich habe nachgeschlagen - es ist 'Expression.Invoke'. Also 'var newBody = Ausdruck.Lambda (oldLambda, Expression.Constant (123), Expression.Constant (" abc "));' etc –