2011-02-27 22 views
6

मैं कोशिश कर रहा हूँ का उपयोग कर एक शब्दकोश कन्वर्ट करने के क्रम में गतिशील जेनरिक बनाना < गतिशील, गतिशील> एक स्थिर टाइप करने के लिए एक कुंजी और मूल्यों के प्रकार की जांच और बनाने का एक नया शब्दकोश द्वारा प्रतिबिंब का उपयोग कर उपयुक्त प्रकार।प्रतिबिंब

Type dictType = typeof(Dictionary<,>); 

     newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType })); 

मैं उदाहरण के लिए, बनाने के लिए आवश्यकता हो सकती है एक शब्दकोश < MyKeyType, गतिशील> मान रहे हैं हालांकि,,: यदि मैं कुंजी और मान प्रकार पता है, मैं निम्न कर सकते हैं नहीं एक ही प्रकार के सभी, और मैं समझ नहीं के बाद से

typeof(dynamic) 

, गतिशील प्रकार निर्दिष्ट करने के लिए कैसे व्यवहार्य नहीं है।

मैं यह करने के बारे में कैसे जाउंगा, और/या जो कुछ करने की कोशिश कर रहा हूं उसे पूरा करने का एक आसान तरीका है?

+0

उस तरफ, उपयोगकेस क्या है? प्रतिबिंब के माध्यम से शब्दकोश बनाना और डेटा के साथ भरना गतिशील उपयोग करने के प्रदर्शन ओवरहेड से धीमा होना चाहिए? –

उत्तर

2
Dictionary<MyType, Object> 

Activator.CreateInstance(typeof (Dictionary<dynamic, dynamic>)); 

यह वास्तव में एक Dictionary<Object, Object>

केवल कोड के दौरान लिख रहा है आप डीआईसी उपयोग कर सकते हैं [ "कुछ"] उपयोग मैं वस्तु के स्थान पर गतिशील का उपयोग करने से देख सकते हैं बनाता है। MyDynProperty .... लेकिन अगर आप आप एक्टिवेटर के साथ ऑब्जेक्ट बनाते हैं, यह ऑब्जेक्ट लौटाएगा ताकि कोड टाइपिंग में कोई उपयोग न हो ...

4

सी # कंपाइलर सिस्टम को उत्सर्जित करता है। "गतिशील" के प्रकार के रूप में ऑब्जेक्ट करें। "गतिशील" एक भाषा-विशिष्ट निर्माण है और इसमें सामान्य भाषा बुनियादी ढांचे में कोई समान प्रकार नहीं है। इस प्रकार, आप "गतिशील" बनाने के लिए प्रतिबिंब का उपयोग नहीं कर पाएंगे और न ही "गतिशील" को सामान्य प्रकार पैरामीटर के रूप में उपयोग करने में सक्षम नहीं होंगे।

एक शब्दकोश < गतिशील, गतिशील > वास्तव में एक शब्दकोश < ऑब्जेक्ट है, ऑब्जेक्ट >। कंपाइलर के लिए "गतिशील" का अर्थ केवल देर से बाध्य होता है किसी भी सदस्य प्रतिबिंब का उपयोग करके ऑब्जेक्ट के लिए उपयोग करता है (जिसका क्रियान्वयन माइक्रोसॉफ्ट में स्थित है। सीसीएचपी असेंबली यदि आप उत्सुक हैं)।

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

+2

वीएस 2010 में भेजे गए मेटाडेटा हस्ताक्षर ब्लॉब पार्सर को लिखने वाले किसी व्यक्ति के रूप में, मुझे आपको बताएं कि डायनामिक एट्रिब्यूट को सही तरीके से संभालने का वास्तविक दर्द है :) –