2010-08-25 15 views
64

मेरी Select a model property using a lambda and not a string property name सवाल का जवाब करते हुए इस प्रकार एक संग्रह करने के लिए गुण जोड़ने के लिए चाहते हैं:कुछ ऑब्जेक्ट गुण क्यों हैं UnaryExpression और अन्य सदस्यExpression?

var props = new ExportPropertyInfoCollection<JobCard>(); 
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true); 
props.Include(model => model.DeviceName).Title("Device").Width(70); 
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83); 

मैं Include विधि में निम्नलिखित कोड लिखा है:

public class PropertyCollection<T> 
{ 
    public void Include(Expression<Func<T, object>> expression) 
    { 
     var memberExpression = expression.Body as MemberExpression; 
     if (memberExpression != null) 
     { 
      var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}}; 
      Properties.Add(pes.Property.Property.Name, pes.Property); 
      return pes; 
    } 

हालांकि, चलाने पर कोड, मैंने पाया कि कुछ लैम्ब्स सदस्य एक्स्पेरेशन मूल्यों के रूप में मिले, लेकिन अन्य यूनरीएक्सप्रेस मूल्य उत्पन्न हुए। 'सरल' प्रकार, यानी स्ट्रिंग DATETIME,, int, bool, में आदि

var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression; 

सभी गुण हैं: मैं इससे पहले कि मैं lambdas का उपयोग कर अपने सभी गुण जोड़ सकता है निम्नलिखित करने के लिए कोड की पहली पंक्ति बदलना पड़ा एक पीओसीओ व्यापार वस्तु। वे कई भिन्न डेटाअनोटेशन विशेषताओं से सजाए गए हैं।

मेरे उदाहरण में lambdas के कुछ MemberExpression मूल्यों और दूसरों UnaryExpression मूल्यों उपज के लिए क्या कारण हैं? मेरे उदाहरण में, पहले UnaryExpression तीसरी पंक्ति पर है, डेटटाइम संपत्ति, लेकिन बूलियन गुणों का भी परिणाम यूनरीएक्सप्रेस है।

+0

UnaryExpression अभिव्यक्ति शायद उपस्थिति (या 'unpresence') नल * स्तंभों की में होती है *? – leppie

+0

@leppie, मुझे संदेह है कि यह गैर-शून्य कॉलम पर है। मेरे उदाहरण में, पहला यूनरीएक्सप्रेस एक डेटटाइम पर है, जहां पूर्व सदस्य एक्सप्रेशन स्ट्रिंग पर हैं। बाद में UnaryExpression एक बूल पर है। – ProfK

+0

मैं थोड़ा सा जांच करूंगा। मैंने पहले इस तरह के अभिव्यक्तियों का उपयोग किया है (या बल्कि दुर्व्यवहार किया है), और कभी भी समस्याएं नहीं थीं, जिसका अर्थ है कि यह हमेशा 'सदस्य एक्स्प्रेसियन' था और मेरा कोड असफल हो जाएगा। आप .NET का किस संस्करण पर चल रहे हैं? मैं अभी तक .NET 4 का उपयोग नहीं करता हूं। – leppie

उत्तर

51

मुझे लगता है कि मुझे पता है कि समस्या क्या है। आपकी अभिव्यक्ति प्रकार object देता है।

यदि आप इसे Expression<Func<T, R>> में बदलते हैं तो रिटर्न प्रकार सही ढंग से अनुमानित किया जाना चाहिए, और UnaryExpression (जो मुझे लगता है कि कुछ मुक्केबाजी ऑपरेशन है) नहीं होना चाहिए।

अद्यतन:

Include के लिए हस्ताक्षर किया जाना चाहिए:

public void Include<T, R>(Expression<Func<T, R>> expression) 
+1

यहां मेरी बेवकूफी क्षमा करें, लेकिन आर क्या होना चाहिए? मैं इसे सदस्य एक्स्प्रेशन नहीं बना सकता, क्योंकि सदस्य एक्सप्रेशन अभिव्यक्ति की बॉडी प्रॉपर्टी में है। मैं मानता हूं कि UnaryExpression शायद मुक्केबाजी के कारण है। – ProfK

+3

@ProfK: आर बस अनुमानित है, यह वापस आने वाली संपत्ति का प्रकार होगा। आप शायद इसका इस्तेमाल नहीं करेंगे, लेकिन आप शायद :) – leppie

+1

मुझे लगता है कि मैं देख रहा हूं कि क्या हो रहा है। क्योंकि अभिव्यक्ति वापसी प्रकार वस्तु है, यह बॉक्स किया गया है।टाइप किए गए रिटर्न प्रकार के साथ, ऐसा नहीं होता है। धन्यवाद @leppie! यहां मदद करने के लिए एक कार्यात्मक व्यक्ति पर भरोसा करें :-) – ProfK

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