2009-10-15 12 views
7

Quando si crea un'espressione lambda a mano, viene visualizzata un'eccezione "Parametro non incluso nell'ambito".Parametro lambda non incluso durante la costruzione dell'espressione lambda binaria

Qualche idea su cosa sto facendo male?

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 

} 

risposta

11

È necessario riutilizzare lo stesso oggetto parametro. Allora, dove hai:

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

dovrebbe essere:

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

So che avrebbe senso per loro a partita per nome, ma che non è solo il modo in cui funziona :(

Se è una vera consolazione, raramente riesco ad avere alberi di espressione fatti a mano la prima volta, devo giurarli per un po ', d'altra parte, credo che nei giorni abbastanza freddi, Marc Gravell possa espirare con attenzione e il suo respiro verrà fuori sotto forma di perfetto albero di espressione gelido codice ...

+0

Ho dovuto rileggerlo una dozzina di volte per rendermi finalmente conto di cosa sta andando storto. Grazie Jon: D –

+0

Tre anni dopo: molte grazie !!! :) – schglurps

Problemi correlati