2009-10-15 13 views
7

Al crear una expresión lambda a mano, aparece la excepción 'Parámetro no en el alcance'.Lambda Parámetro no incluido en el ámbito: al compilar una expresión lambda binaria

¿Alguna idea de lo que estoy haciendo 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 

} 

Respuesta

11

Necesita reutilizar el mismo objeto de parámetro. Entonces, ¿dónde tienes:

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

que debe ser:

MemberExpression left = Expression.Property(para, property); 

Sé que tendría sentido para ellos para que coincida con el nombre, pero eso no es la forma en que funciona :(

Si te sirve de consuelo, raramente obtengo árboles de expresión hechos a mano la primera vez. Tengo que jurarlos por un tiempo. Por otro lado, creo que en días suficientemente fríos, Marc Gravell puede exhalar con cuidado y su aliento saldrá en forma de código de árbol de expresión perfecta y helada ...

+0

Tuve que volver a leer esto una docena de veces para finalmente darme cuenta de lo que está pasando mal. Gracias Jon: D –

+0

Tres años después: muchas gracias! :) – schglurps

Cuestiones relacionadas