2017-06-01 3 views
-3

I'v ein Verfahren baut Ausdruck dynamisch zu konstruieren, ist unter meinem Code:Wie Ausdruck bekommen bauen (c => c.user.code == 'XXX') dynamisch

public static Expression<Func<T, bool>> BuildStringEqualLambda(string propertyName, string propertyValue) 
{ 
    ParameterExpression parameterExp = Expression.Parameter(typeof(T), "type"); 
    Expression propertyExp = Expression.Property(parameterExp, propertyName); 
    Expression right = Expression.Constant(propertyValue); 
    Expression e1 = Expression.Equal(propertyExp, right); 
    return Expression.Lambda<Func<T, bool>>(e1, new ParameterExpression[] { parameterExp }); 
} 

Aber wenn die Lambda wie

c=>c.user.code == 'XXX' 

und ich rufe Methode wie unten:

BuildStringEqualLambda("user.code","XXX"); 

Verfahren Fehler melden.

Also meine Frage ist, wie Ausdruck bekommen bauen (c => c.user.code == 'XXX') dynamisch

+2

"Die Methode kann es nicht behandeln." was meinst du damit? –

Antwort

1

Statt:

ParameterExpression parameterExp = Expression.Parameter(typeof(T), "type"); 
Expression propertyExp = Expression.Property(parameterExp, propertyName); 

Sie müssen für jede tiefer gehen Eigenschaft:

ParameterExpression parameterExp = Expression.Parameter(typeof(T), "type"); 
Expression propertyExp = parameterExp; 
foreach (var property in propertyName.Split('.')) { 
    propertyExp = Expression.PropertyOrField(propertyExp, property); 
} 
+0

Der Anfangswert von propertyExp ist was? – user2155362

+0

@ user2155362 Ich habe meine Antwort aktualisiert –

Verwandte Themen