2014-11-06 11 views
19

आज सी # गतिशीलता को देखते समय मुझे कुछ आश्चर्यचकित हुआ (मैंने कभी उनका उपयोग नहीं किया है, लेकिन हाल ही में मैं नैन्सी वेब ढांचे के साथ प्रयोग कर रहा हूं)। मैंने पाया कि मैं ऐसा नहीं कर सकता है:मैं एक ExpandoObject में क्यों इंडेक्स नहीं कर सकता?

dynamic expando = new ExpandoObject(); 

expando.name = "John"; 

Console.WriteLine(expando["name"]); 

अंतिम पंक्ति एक अपवाद फेंकता है:

प्रकार की 'System.Dynamic.ExpandoObject'

एक अभिव्यक्ति के लिए [] के साथ अनुक्रमण लागू नहीं कर सकता

मैं त्रुटि संदेश को समझता हूं, लेकिन मुझे समझ में नहीं आता कि यह क्यों हो रहा है। मैंने ExpandoObject के लिए प्रलेखन को देखा है और यह स्पष्ट रूप से IDictionary<,> लागू करता है और इस प्रकार this.[index] विधि (MSDN) है। मैं इसे क्यों नहीं बुला सकता?

बेशक, मुझे ExpandoObject को मैन्युअल रूप से एक शब्दकोश में डाउनकास्टिंग से रोकने और फिर उसमें अनुक्रमणित करने से रोकने के लिए कुछ भी नहीं है, लेकिन उस तरह की समस्या का उल्लंघन करता है; यह यह भी समझाता नहीं है कि कैसे Expando अपने इंटरफेस की विधि को छिपाने में सक्षम था।

यहां क्या हो रहा है?

+3

स्पष्ट इंटरफेस कार्यान्वयन केवल यदि उद्देश्य यह है कि इंटरफेस करने के लिए डाला जाता है पहुँचा जा सकता है, है ना कुछ विशेष है ExpanoObject करने के लिए। –

+1

प्रासंगिक स्रोत कोड: http://referencesource.microsoft.com/#System.Core/Microsoft/Scripting/Actions/ExpandoObject.cs,552 –

उत्तर

28

कैसे एक्सपोन्डो अपने इंटरफेस की विधि को छिपाने में सक्षम था।

क्योंकि आपने दस्तावेज़ में सही ढंग से पता लगाया है, indexer isexplicit interface implementationExplicit Interface Implementation Tutorial से:

एक कक्षा जो इंटरफ़ेस लागू करती है स्पष्ट रूप से उस इंटरफ़ेस के सदस्य को कार्यान्वित कर सकती है। जब कोई सदस्य स्पष्ट रूप से कार्यान्वित किया जाता है, तो उसे कक्षा के उदाहरण के माध्यम से एक्सेस नहीं किया जा सकता है, लेकिन केवल इंटरफ़ेस के उदाहरण के माध्यम से।

इसका मतलब है आप इसे उपयोग करने में इंटरफ़ेस के संदर्भ में कास्ट करने के लिए होगा:

((IDictionary<String, Object>)expando)["name"] 
+0

धन्यवाद @ कोडकस्टर। मैं स्पष्ट इंटरफेस कार्यान्वयन के बारे में जानता था, लेकिन मैंने सोचा कि यह सिर्फ एक ही नाम के साथ दो सदस्यों को लागू करने के लिए था; मैंने इसे पहले कभी सदस्य को छिपाने के लिए उपयोग नहीं किया था। क्या आप जानते हैं कि उन्होंने ExpandoObject के साथ ऐसा क्यों किया है? – Richiban

+1

@ रिचिबैन केवल अनुमान लगा सकता है, लेकिन [इसी तरह के प्रश्न पर मार्क ग्रेवेल का जवाब] देखें (http://stackoverflow.com/questions/280495/why-to-use-explicit-interface-implementation-to-invoke-a- संरक्षित विधि): _ "कोर सार्वजनिक एपीआई साफ रखने के लिए" _। – CodeCaster

+7

यह एक ExpandoObject का उपयोग करने के उद्देश्य को हराने के लिए प्रतीत होता है। साथ ही इसे एक शब्दकोश के रूप में घोषित करें। – Triynko

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