2012-03-06 10 views
5

मेरे पास कुछ कोड है जो डेटाबेस कॉल द्वारा पॉप्युलेट एक्सपांडो ऑब्जेक्ट्स के साथ काम करता है। अनिवार्य रूप से कुछ मूल्य शून्य हैं। जब मैं ऑब्जेन्डो ऑब्जेक्ट के रूप में ऑब्जेक्ट्स को देखता हूं, तो मैं अंतर्निहित शब्दकोश में सभी चाबियाँ और मान (नल शामिल) देखता हूं। लेकिन अगर मैं गतिशील संदर्भ के माध्यम से उन्हें एक्सेस करने का प्रयास करता हूं, तो कोई भी कुंजी जिसमें संबंधित शून्य मान होता है, वस्तु के गतिशील दृश्य में दिखाई नहीं देता है। जब मैं डायनामिक संदर्भ पर प्रॉपर्टी सिंटैक्स के माध्यम से इसे एक्सेस करने का प्रयास करता हूं तो मुझे एक ArgumentNullException मिलता है।ExpandoObjects के डायनामिक व्यू "छुपाएं" गुण शून्य मान

मुझे पता है कि मैं सीधे एक्सपोन्डोब्जेक्ट के साथ काम करके, कोशिश करने वाले कैच का एक गुच्छा जोड़कर, एक ठोस प्रकार आदि में विस्तार करने के लिए काम कर सकता हूं, लेकिन इस तरह की गतिशील वस्तु को इस गतिशील वस्तु के उद्देश्य से पराजित करता है पहले स्थान पर। कोड जो डायनामिक ऑब्जेक्ट का उपभोग करता है ठीक काम करेगा अगर कुछ गुणों में शून्य मान होते हैं। क्या इन गतिशील गुणों को "अनदेखा" करने का एक और अधिक स्पष्ट या संक्षिप्त तरीका है जिसमें शून्य मान हैं?

यहाँ कोड है कि मेरी "समस्या" को दर्शाता है है

dynamic dynamicRef = new ExpandoObject(); 
ExpandoObject expandoRef = dynamicRef; 

dynamicRef.SimpleProperty = "SomeString"; 
dynamicRef.NulledProperty = null; 

string someString1 = string.Format("{0}", dynamicRef.SimpleProperty); 

// My bad; this throws because the value is actually null, not because it isn't 
// present. Set a breakppoint and look at the quickwatch on the dynamicRef vs. 
// the expandoRef to see why I let myself be led astray. NulledProperty does not 
// show up in the Dynamic View of the dynamicRef 
string someString2 = string.Format("{0}", dynamicRef.NulledProperty); 
+0

ExpandoObject के शून्य मान स्टोर कर सकते हैं, और उन्हें बाहर खींच, आप के बारे में सुनिश्चित क्या तर्क अशक्त अपवाद उत्पन्न कर रहा है कर रहे हैं? – jbtule

+1

यदि कुंजी 'ExpandoObject' में मौजूद है, तो यह वापस लौटाएगी कि यह 'शून्य' है या नहीं। यदि यह मौजूद नहीं है, तो यह 'RuntimeBinderException' फेंक देगा। यह 'ArgumentNullException' नहीं फेंक देगा, इसलिए आपके कोड में कुछ त्रुटि होनी चाहिए। क्या आप हमें वह कोड दिखा सकते हैं जो फेंकता है? – svick

+0

ठीक है, मुझे लगता है कि मुझे विजुअल स्टूडियो घड़ी विंडो द्वारा बेवकूफ़ बना दिया जा रहा है। कोड एक ArgumentNullException फेंक रहा है क्योंकि मान वास्तव में शून्य है, न कि क्योंकि संपत्ति "गायब" है। जब मैं गतिशील संदर्भ पर एक घड़ी सेट करता हूं, तो यह संपत्ति को नहीं दिखाता है यदि उसके पास शून्य मान है। अगर मैं एक ही वस्तु के लिए ExpandoObject संदर्भ देखता हूं, तो यह अंतर्निहित कुंजी सूची में संपत्ति का नाम दिखाता है। –

उत्तर

3

समस्या आप कर रहे हैं कि गतिशील क्रम अधिभार मंगलाचरण इरादा string.Format(string format, object arg0) एक सरल डाली string.Format की एक स्थिर मंगलाचरण में बदल जाएगा के बजाय string .Format(format, params object[] args) उठा है और इसे ठीक करें।

string someString2 = string.Format("{0}", (object)dynamicRef.NulledProperty); 
+0

बिल्कुल सही! उस पर इसका ख्याल रखा। –

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