2008-10-08 18 views
35

मैं पावरशेल में .NET ढांचे में धक्का दे रहा हूं, और मैंने कुछ ऐसा मारा है जिसे मैं समझ नहीं पा रहा हूं। यह ठीक काम करता है:पावरशेल जेनेरिक संग्रह

$foo = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]" 
$foo.Add("FOO", "BAR") 
$foo 

Key               Value 
---               ----- 
FOO               BAR 

हालांकि यह नहीं करता है:

$bar = New-Object "System.Collections.Generic.SortedDictionary``2[System.String,System.String]" 
New-Object : Cannot find type [System.Collections.Generic.SortedDictionary`2[System.String,System.String]]: make sure t 
he assembly containing this type is loaded. 
At line:1 char:18 
+ $bar = New-Object <<<< "System.Collections.Generic.SortedDictionary``2[System.String,System.String]" 

वे दोनों एक ही विधानसभा में हैं, तो मैं क्या याद आ रही है?

जैसा कि उत्तर में बताया गया था, यह PowerShell v1 के साथ केवल एक मुद्दा है।

उत्तर

17

शब्दकोश < के, वी> को सॉर्टेड डिक्शनरी < के, वी> के समान असेंबली में परिभाषित नहीं किया गया है। एक mscorlib में है और दूसरा system.dll में है।

इसमें समस्या है। PowerShell में वर्तमान व्यवहार यह है कि निर्दिष्ट सामान्य पैरामीटर को हल करते समय, यदि प्रकार पूरी तरह से योग्य प्रकार के नाम नहीं हैं, तो यह मानता है कि वे उसी सामान्य असेंबली में हैं जो सामान्य प्रकार को आप तुरंत चालू करने का प्रयास कर रहे हैं।

इस मामले में, इसका मतलब है कि यह System.dll में System.String की तलाश में है, और mscorlib में नहीं, इसलिए यह विफल हो जाता है।

समाधान जेनेरिक पैरामीटर प्रकारों के लिए पूरी तरह से योग्य असेंबली नाम निर्दिष्ट करना है। यह अत्यंत बदसूरत है, लेकिन काम करता है:

$bar = new-object "System.Collections.Generic.Dictionary``2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" 
+0

क्या कोई संदर्भ है जो इस वाक्यविन्यास का वर्णन करता है? मैं एक पावरहेल ऑब्जेक्ट से BeginInvoke को कार्यान्वित करने और इसके लिए ओवरलोड में से एक में इनपुट और आउटपुट पैरामीटर का उपयोग करने के साथ एक समय का एक बिल्ली रखने की कोशिश कर रहा हूं। मुझे सिर्फ घोषणा सही नहीं लग रही है। –

4

जेनरिक्स इन पावरशेल के साथ कुछ मुद्दे हैं। पावरशेल टीम के एक देव ली होम्स ने जेनेरिक बनाने के लिए this script पोस्ट किया।

+2

[संचित लिंक] (https://web.archive.org/web/20090926122811 /http://www.leeholmes.com/blog/CreatingGenericTypesInPowerShell.aspx) – user2426679

+1

क्या यह अभी तक "इस शाम" है? :) – mklement0

78

PowerShell 2.0 में बनाने के लिए नए तरीके से एक Dictionary है:

$object = New-Object 'system.collections.generic.dictionary[string,int]' 
+0

+1 बहुत बेहतर उत्तर – galaktor

+7

यह सच है कि यह एक बेहतर जवाब है। ** यदि ** उपयोगकर्ता v2 पर है। हालांकि v1 के संबंध में सवाल पूछा गया था। दुनिया में अभी भी बड़ी संख्या में लोग हैं जो v1 पर भी हैं। – EBGreen

+0

जाहिर है, यदि किसी तृतीय पक्ष असेंबली में किसी प्रकार का घोषित किया गया है तो आपको v2 में एक ही समस्या होगी: http://stackoverflow.com/questions/11975130। ऐसा लगता है कि v4 में तय किया गया है – marsze