2009-10-15 7 views
7

हाथ से लैम्ब्डा अभिव्यक्ति बनाते समय मुझे 'पैरामीटर नहीं है' अपवाद मिलता है।लैम्ब्डा पैरामीटर स्कोप में नहीं - बाइनरी लैम्ब्डा अभिव्यक्ति का निर्माण करते समय

कोई विचार क्या मैं गलत कर रहा हूं?

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 

} 

उत्तर

11

आपको उसी पैरामीटर ऑब्जेक्ट का पुन: उपयोग करने की आवश्यकता है। तो तुम मिल गया है, जहां है:

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

यह होना चाहिए:

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

मैं जानता हूँ कि यह मतलब होगा उन्हें नाम से मिलान करने के लिए के लिए है, लेकिन यह अभी जिस तरह नहीं यह काम करता है :(

यदि यह कोई सांत्वना है, तो मुझे बहुत ही कम समय में हाथ से निर्मित अभिव्यक्ति पेड़ मिलते हैं। मुझे थोड़ी देर के लिए उनकी कसम खाता है। दूसरी तरफ, मुझे विश्वास है कि पर्याप्त दिनों में ठंडा होने पर, मार्क ग्रेवल सावधानी से बाहर निकल सकते हैं और उसकी सांस सही, ठंढ अभिव्यक्ति वृक्ष कोड के रूप में बाहर आ जाएगी ...

+0

मुझे अंत में यह पता चलने के लिए एक दर्जन बार फिर से पढ़ना पड़ा कि क्या गलत हो रहा है। धन्यवाद जॉन: डी –

+0

तीन साल बाद: बहुत धन्यवाद !!! :) – schglurps

संबंधित मुद्दे