Paramètre Lambda non inclus dans la portée - lors de la création d'une expression lambda binaire

c# expression-trees lambda

Question

Lors de la création manuelle d'une expression lambda, une exception "Paramètre non inclus dans la portée" est générée.

Des idées sur ce que je fais mal?

 public class OtherType
    {
        public string First_Name { get; set; }
        public string Last_Name { get; set; }

    }
    static void Main(string[] args)
        {

          Expression<Func<OtherType, bool>> l2 = 
                p => p.First_Name == "Bob";
            l2.Compile();  // Works 


            PropertyInfo property = 
                typeof(OtherType).GetProperty("First_Name");

            ParameterExpression para = 
                Expression.Parameter(typeof(OtherType), "para");

            ConstantExpression right = 
                Expression.Constant("Bob", typeof(string));

            MemberExpression left = 
                Expression.Property(Expression.Parameter(typeof(OtherType), "para"), property);

            BinaryExpression binary = 
                Expression.MakeBinary(ExpressionType.Equal, left, right);

            Expression<Func<OtherType, bool>> l = 
                Expression.Lambda<Func<OtherType, bool>>(binary, new ParameterExpression[] { para });

            l.Compile(); // Get a 'Lambda Parameter not in scope' exception

}

Réponse acceptée

Vous devez réutiliser le même objet de paramètre. Alors, où vous avez:

 MemberExpression left = Expression.Property
     (Expression.Parameter(typeof(OtherType), "para"), property);

CA devrait etre:

 MemberExpression left = Expression.Property
     (Expression.Parameter(typeof(OtherType), "para"), property);

Je sais qu'il serait logique qu'ils correspondent par leur nom, mais ce n'est pas comme ça que ça fonctionne :(

Si cela peut vous réconforter, j’ai très rarement des arbres d’expression construits à la main de la première fois. Je dois leur jurer pendant un moment. D'autre part, je pense que les jours suffisamment froids, Marc Gravell peut expirer avec précaution et son souffle ressortira sous la forme d'un code d'arbre d'expression parfait et glacé ...




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