2010-02-19 12 views
6

मैं एक Dictionary(TKey, TValue)बेनामी प्रकार

तरह
Dictionary<int, ArrayList> Deduction_Employees = 
    new Dictionary<int, ArrayList>(); 

और बाद में मुझे लगता है मैं कैसे Unbox सकता है कि वर और उन गुणों का उपयोग इस

var day_and_type = new { 
    TheDay = myDay, 
    EntranceOrExit = isEntranceDelay 
}; 

Deduction_Employees[Employee_ID].Add(day_and_type); 

अब की तरह एक गुमनाम प्रकार है कि सरणी सूची में जोड़ने ??

+4

बड़ा सवाल यह है कि आप क्यों चाहते हैं? आप क्या हासिल करने का प्रयास कर रहे हैं? – pdr

उत्तर

13

सबसे पहले, आप इस प्रकार को अनबॉक्स नहीं कर रहे हैं। बेनामी प्रकार संदर्भ प्रकार हैं, संरचनाओं नहीं।

(खंड सी # 3.0 भाषा विशिष्टता, जिसमें कहा गया है की 7.5.10.6 के अनुसार भले ही आप तकनीकी रूप से विधि उन्हें घोषित किये गए थे के बाहर एक ही प्रकार के उदाहरण बना सकते हैं: भीतर

एक ही कार्यक्रम दो गुमनाम वस्तु initializers है कि एक ही नामों की संपत्तियों की एक अनुक्रम को निर्दिष्ट और संकलन समय उसी क्रम ही गुमनाम प्रकार के उदाहरण का उत्पादन करेगा में प्रकार के।

) आपके पास नाम नाम का कोई तरीका नहीं है, जिसे आप Object से अपने द्वारा बनाए गए प्रकार पर कास्ट करने के लिए आवश्यक हैं। आपको cast-by-example solution का सहारा लेना होगा जो स्वाभाविक रूप से त्रुटिपूर्ण है।

कास्ट-बाय-उदाहरण दोषपूर्ण है क्योंकि डिज़ाइन स्टैंडपॉइंट से, प्रत्येक स्थान जिसे आप फ़ंक्शन के बाहर के प्रकार तक पहुंचना चाहते हैं, इसे घोषित किया जाता है (और अभी भी उसी मॉड्यूल के अंदर), आपको प्रभावी रूप से इस प्रकार का प्रकार घोषित करना होगा फिर।

यह प्रयास का एक डुप्लिकेशंस है जो मैला डिजाइन और कार्यान्वयन की ओर जाता है।

यदि आप .NET 4.0 का उपयोग कर रहे हैं, तो आप ऑब्जेक्ट आवृत्ति को गतिशील चर में रख सकते हैं। हालांकि, बड़ी कमी सदस्य की पहुंच के संकलन-समय सत्यापन की कमी है। आप आसानी से सदस्य के नाम की गलत वर्तनी कर सकते हैं, और उसके बाद आपके पास संकलन-समय त्रुटि के बजाय रन-टाइम त्रुटि हो सकती है।

आखिरकार, यदि आपको विधि के बाहर किसी अज्ञात प्रकार का उपयोग करने की आवश्यकता मिलती है, तो एकमात्र अच्छा समाधान ठोस प्रकार बनाने और ठोस प्रकार के लिए अज्ञात प्रकार को प्रतिस्थापित करना है।

1

नहीं, आप नहीं कर सकते। आप केवल प्रतिबिंब का उपयोग कर गुणों तक पहुंच सकते हैं। कंपाइलर का यह जानने का कोई तरीका नहीं है कि यह किस प्रकार का था, और चूंकि यह एक अनाम प्रकार है, इसलिए आप इसे भी नहीं डाल सकते हैं।

1

यदि आप .NET 1.x - 3.x का उपयोग कर रहे हैं, तो आपको प्रतिबिंब का उपयोग करना होगा।

यदि आप .NET 4.0 का उपयोग करते हैं, तो आप गतिशील प्रकार का उपयोग कर सकते हैं और अपेक्षित गुणों को कॉल कर सकते हैं।

किसी भी मामले में आपको अनबॉक्स करने की आवश्यकता नहीं है; यह मूल्य प्रकार के लिए है। बेनामी प्रकार हमेशा संदर्भ प्रकार होते हैं।

3

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

स्रोत: http://msdn.microsoft.com/en-us/library/bb397696.aspx

8

ऐसे कई तरीके हैं।

चूंकि टिप्पणियां इंगित करती हैं कि मुझे लगता है कि आप ऐसा करते हैं, तो मुझे यह स्पष्ट करने दें: आपको अपने ऑब्जेक्ट के लिए नामित प्रकार बनाना चाहिए क्योंकि आप इसे पास करना चाहते हैं।

सबसे पहले, आप प्रतिबिंब का उपयोग कर सकते हैं, जो यहां एक और उत्तर पहले से ही इंगित कर चुका है।

एक और तरीका, जो आपको सही प्रकार देने में .NET को "उदाहरण के द्वारा कास्ट" के रूप में जाना जाता है, और यह कुछ ऐसा होता है: आपको अपनी ऑब्जेक्ट को जेनेरिक विधि कॉल के माध्यम से पास करने की आवश्यकता होती है, जो ऑब्जेक्ट को वापस कर देगी सही प्रकार के रूप में, सही प्रकार का वापस लौटने के लिए।

उदाहरण के लिए, इस प्रयास करें:

private static T CastByExample<T>(T example, object value) 
{ 
    return (T)value; 
} 

और इसका इस्तेमाल करने के लिए:

var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj); 
दो के लिए

?? स्पॉट्स, आपको बस उन गुणों के लिए डेटा प्रकार को फ़िट करने की आवश्यकता है, मानों का उपयोग नहीं किया जाएगा।

यह इस तथ्य का शोषण करता है कि एक ही प्रकार में, उसी क्रम में, समान प्रकार के सटीक समान गुण वाले एकाधिक अनाम प्रकार, एक ही प्रकार के लिए मानचित्रित होंगे।

हालांकि, इस समय तक आपको इसके नाम पर एक नाम टाइप करना चाहिए।

+0

+1 बस एमएसडीएन पर उस टिप्पणी को देखा और हालांकि इसका फायदा कैसे उठाया जाए - "यदि दो या दो से अधिक अनाम प्रकारों में समान क्रम में समान संख्या और गुण होते हैं, तो संकलक उन्हें एक ही प्रकार के रूप में मानता है और वे समान संकलक साझा करते हैं जनरेटेड प्रकार की जानकारी। " – Kobi

+0

@ लेस वी। कार्ल्सन: आखिरकार, कास्ट-बाय-उदाहरण एक झगड़ा है। आप उस मॉड्यूल में विधि के बाहर प्रत्येक स्थान पर प्रकार को प्रभावी रूप से फिर से घोषित कर रहे हैं, जिसे आप उस तक पहुंच प्राप्त करना चाहते हैं, पुन: उपयोग के मूल प्रधानाचार्यों का उल्लंघन करना। – casperOne

+0

बहुत अच्छा है, लेकिन यह बहुत अजीब लगता है। लगभग बुराई :) –

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