Crea Func da MemberExpression e Constant

.net c# expression expression-trees lambda

Domanda

Non faccio abbastanza lavoro con le espressioni per farlo funzionare ...

In sostanza ciò che voglio creare è m.MyProperty == 1 , da utilizzare in un metodo che accetta Func<T, bool> .

Ho già un MemberExpression . Ho provato varie cose, ma continuo a ricevere errori diversi.

Al momento ho qualcosa di simile (che non funziona):

object const = 1;
var equalExpression = Expression.Equal( memberExpression, Expression.Constant( const ) );
var compiled = Expression.Lambda<Func<T, bool>>( equalExpression, Expression.Parameter( typeof( T ) ).Compile();

Questo mi dà un'eccezione:

System.InvalidOperationException: variabile 'm' di tipo 'MyType' referenziata dall'ambito '', ma non è definita

Ho provato a rielaborare diverse parti di questo ma non ho trovato nulla che funzioni.

Il const è un oggetto che può essere di qualsiasi tipo, ma deve corrispondere al tipo di MemberExpression .

Soluzione:

object c = 1;
var parameterExpression = (ParameterExpression)memberExpression.Expression;
var equalExpression = Expression.Equal(memberExpression, Expression.Constant(c));
var compiled = Expression.Lambda<Func<T, bool>>(equalExpression, parameterExpression).Compile();

Risposta accettata

La ragione per cui questo non funziona è che stai usando un'espressione di parametro "free-standing" durante la compilazione del tuo lambda. È necessario creare Expression.Parameter( typeof( T )) prima di rendere memberExpression e utilizzare la stessa istanza di ParameterExpression quando si crea un'espressione membro e quando si compila il lambda:

var pe = Expression.Parameter( typeof( T )); // <<== Here
var memberExpression = Expression.PropertyOrField(pe /* Here */, "MyProperty");
var equalExpression = Expression.Equal( memberExpression, Expression.Constant( const ) );
var compiled = Expression.Lambda<Func<T, bool>>( equalExpression, pe ).Compile();
//                                                                ^^
//                                                                ||
//                                                             And here


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché