Créer Func de MemberExpression et Constant

.net c# expression expression-trees lambda

Question

Je ne fais pas assez d'arbre d'expression pour que ça fonctionne ...

Ce que je veux créer est m.MyProperty == 1 , à utiliser dans une méthode prenant Func<T, bool> .

J'ai déjà un MemberExpression . J'ai essayé diverses choses, mais je continue à avoir des erreurs différentes.

J'ai actuellement quelque chose comme ça (ça ne marche pas):

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

Cela me donne une exception:

System.InvalidOperationException: variable 'm' de type 'MyType' référencée depuis scope '', mais elle n'est pas définie

J'ai essayé de retravailler plusieurs parties différentes mais je n'ai rien trouvé qui fonctionne.

La const est un objet qui peut être n'importe quel type, mais doit correspondre au type de MemberExpression .

Solution:

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

Réponse acceptée

Cela ne fonctionne pas parce que vous utilisez une expression de paramètre "autonome" lors de la compilation de votre lambda. Vous devez créer Expression.Parameter( typeof( T )) avant de créer memberExpression et utiliser la même instance de ParameterExpression fois lorsque vous créez une expression membre et lors de la compilation du 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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow