2013-01-01 15 views
10

मैं इस विस्तार विधि ने लिखा है:IENumerable <dynamic> पर कनवर्ट करें?

public static class A 
{ 
public static IEnumerable<dynamic> AsDynamic<T>(this IEnumerable<T> f) 
    { 
     foreach (var element in f) 
     { 
       yield return (dynamic) element; 
     } 
    } 
} 

और यह परीक्षण किया:

List<int> l = new List<int>(){1,2,3}; 
Console.WriteLine (l.AsDynamic().GetType()); 

हालांकि उत्पादन होता है: typeof (IEnumerable<Object>)

  • ऐसा क्यों है typeof (IEnumerable<dynamic>) नहीं है?

  • मैं इसे इस तरह कैसे बना सकता हूं?

+2

["ज्यादातर मामलों में, यह इस तरह की कार्य करता है जैसे कि टाइप ऑब्जेक्ट है।"] (Http://msdn.microsoft.com/en-us/library/dd264736.aspx) –

+1

रनटाइम पर कोई 'गतिशील' प्रकार नहीं है , वे केवल ऑब्जेक्ट के रूप में टाइप किए गए हैं और विधि बाध्यकारी जानकारी गतिशील चर शामिल प्रत्येक कॉल साइट पर आउटपुट है। – Lee

उत्तर

21

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

जब आप का कहना है कि एक वस्तु dynamic है, संकलक प्रकार के बारे में मान्यताओं नहीं कर सकते हैं, तो यह object का उपयोग करता है, जानते हुए भी कि कुछ भी object के रूप में जमा किया जा सकता है। जब आप एक IEnumerable<dynamic> बनाने के लिए, यह IEnumerable<object> हो जाता है, एक महत्वपूर्ण अंतर के साथ: यदि आप अपने तत्वों पर किसी भी विधि कॉल कर सकते हैं, और संकलक एक शब्द कहना नहीं होगा:

IEnumerable<SomeType> original = ... 
foreach (dynamic x in original.AsDynamic()) { // Using your method 
    Console.WriteLine(x.SomeUnsupportedMethod()); // The compiler is silent! 
} 

original.AsDynamic() के बाद से dynamic वस्तुओं की एक अनुक्रम देता है, कंपाइलर आपके कॉल के बारे में SomeUnsupportedMethod पर शिकायत नहीं करता है।यदि विधि वास्तव में रनटाइम पर समर्थित नहीं है, तो प्रोग्राम क्रैश हो जाएगा; यदि विधि वास्तव में SomeType के तत्वों द्वारा समर्थित है, तो कोई क्रैश नहीं होगा, और विधि लागू की जाएगी।

यह सब dynamic आपके लिए करेगा; सांख्यिकीय रूप से, "प्लेसहोल्डर" object रहेगा, और typeof आपको उतना ही बताएगा। लेकिन ऑब्जेक्ट (इसकी विधियों और गुणों) की सटीक क्षमताओं को रनटाइम तक जांच नहीं की जाएगी।

+1

जैसा कि मैं टिप्पणियों में किसी अन्य उत्तर में चर्चाओं से समझता हूं, 'टाइपऑफ (आईनेमरेबल ) लिखना वास्तव में कानूनी रूप से कानूनी है (लेकिन उपयोगी नहीं है) सी # में है, लेकिन यह उसी प्रकार के रनटाइम प्रकार को टाइप टाइप (आईनेमरेबल )' बनाता है। हालांकि, 'टाइपऑफ (ऑब्जेक्ट)' के लिए समानार्थी के रूप में टाइप टाइप (गतिशील) 'की अनुमति नहीं है। वैसे, 'GetType() 'निश्चित रूप से एक इंटरफ़ेस प्रकार कभी नहीं लौटाएगा, इसलिए मूल पोस्टर सटीक नहीं था। –

+0

@JeppeStigNielsen http://i.stack.imgur.com/9C4sD.jpg –

+0

@RoyiNamir मुझे यकीन नहीं है कि मैं आपके स्क्रीन शॉट को समझता हूं (मैं LINQPad से परिचित नहीं हूं)। दोनों पंक्तियों में अलग टाइपोग्राफी है। वे दो 'WriteLine' विधि कॉल का आउटपुट नहीं हैं। 'GetType()' 'RuntimeType 'ऑब्जेक्ट देता है, पहले' WriteLine' 'toString()' विधि में इसे कॉल किया जाता है। प्रकार एक जेनरेट प्रकार होगा (एक अजीब नाम वाला वर्ग '<', '>', और इसमें '__' वर्ण) क्योंकि आपके पास एक इटरेटर ब्लॉक (' उपज रिटर्न') है। इसे आज़माएं: 'अगर (एल। एएसडैनेमिक()। GetType() == टाइपऑफ (IENumerable )) नया अपवाद फेंक दें ("जेप गलत था!"); ' –

0

लिंक एक्सटेंशन विधि Cast() का प्रयास करें। लेकिन मुझे यकीन नहीं है कि यह गतिशील के साथ काम करेगा।

0

क्योंकि dynamic एक प्रकार

Console.WriteLine(typeof(dynamic)); // error 

गतिशील सिर्फ क्रम

+0

एमएसडीएन "टाइप" को भी संदर्भित करता है: [विज़ुअल सी # 2010 एक नया प्रकार, गतिशील] प्रस्तुत करता है (http://msdn.microsoft.com/en-us/library/dd264736.aspx) –

+0

@ कुछ 1। किल। डीजे - संकलन त्रुटि में 'टाइपोफ (गतिशील)' परिणामों का उपयोग करने का प्रयास कर रहा है, "टाइपफ़ो ऑपरेटर गतिशील प्रकार पर उपयोग नहीं किया जा सकता है।" – Lee

+0

@Lee 'गतिशील' एक प्रकार है जो रन टाइम पर ज्ञात नहीं है .. गतिशील और ऑब्जेक्ट समान हैं, गतिशील को छोड़कर आप उन चीजों को करने की सुविधा देते हैं जो संकलन समय – Anirudha

1

डिजाइन करके, कार्यावधि में वास्तविक प्रकार बाइंडिंग स्थिर बंधन के रूप में इसी तरह संभव के रूप में व्यवहार करते हैं निराकरण नहीं है।

तो क्रम प्रकार typeof (IEnumerable<Object>)

होगा स्थिर प्रकार typeof (IEnumerable<dynamic>)

इसके अलावा

क्रम व्यवहार करता है यह सच हो सकता है धारणात्मक

typeof(object)==typeof(dynamic) 

तो,

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

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