Accéder à la valeur d'une expression de membre

c# expression-trees lambda linq

Question

Si j'ai un produit.

var p = new Product { Price = 30 };

et j'ai la requête linq suivante.

var p = new Product { Price = 30 };

Dans un fournisseur IQueryable, je récupère une expression MemberExpression pour le p.Price qui contient une expression constante, mais il me semble impossible d'obtenir la valeur "30".

Mise à jour J'ai essayé cela mais cela ne semble pas fonctionner.

var p = new Product { Price = 30 };

À votre santé.

Réponse acceptée

Vous pouvez compiler et appeler une expression lambda dont le corps est l'accès membre:

private object GetValue(MemberExpression member)
{
    var objectMember = Expression.Convert(member, typeof(object));

    var getterLambda = Expression.Lambda<Func<object>>(objectMember);

    var getter = getterLambda.Compile();

    return getter();
}

L'évaluation locale est une technique courante lors de l'analyse des arbres d'expression. LINQ to SQL fait exactement cela à plusieurs endroits.


Réponse d'expert

L'expression constante va pointer sur une classe de capture générée par le compilateur. Je n'ai pas inclus les points de décision, etc., mais voici comment en obtenir 30:

var p = new Product { Price = 30 };
Expression<Func<Product, bool>> predicate = x => x.Price == p.Price;
BinaryExpression eq = (BinaryExpression)predicate.Body;
MemberExpression productToPrice = (MemberExpression)eq.Right;
MemberExpression captureToProduct = (MemberExpression)productToPrice.Expression;
ConstantExpression captureConst = (ConstantExpression)captureToProduct.Expression;
object product = ((FieldInfo)captureToProduct.Member).GetValue(captureConst.Value);
object price = ((PropertyInfo)productToPrice.Member).GetValue(product, null);

price est maintenant 30 . Notez que je suppose que Price est une propriété, mais en réalité vous GetValue une méthode GetValue qui gère la propriété / le champ.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi