2013-03-15 9 views
6
MonoBehavior[] list; // This is from Unity3d but think of it as Object, 
        // all classes inherit from it. 

सूची अल्फा से कुछ अल्फा हैं, कुछ अल्फा, कक्षा अल्फा से हैं, और अन्य अन्य कक्षाओं से हैं। Foreach अल्फा स्क्रिप्ट सूची में पाया कुछ करना, हर दूसरे घटक की अनदेखी:एक सूची में foreach [सी #]

foreach(Alpha a in list) // Alpha is a script. 
    a.doSomething(); 

मैं इस धारणा है कि मेरी foreach इस तरह से काम करेगा तहत किया गया।

यह एक कास्टिंग समस्या है, मुझे लगता है। कृपया मुझे कास्टिंग/बहुरूपता को बेहतर समझने में मदद करें।

मैं निष्पादन के दौरान यह त्रुटि प्राप्त: स्रोत प्रकार से गंतव्य प्रकार

+0

बहुत सारे अच्छे उत्तर, धन्यवाद। मैं कुछ सोचने के बाद सबसे अच्छा चुनूंगा :) –

उत्तर

2

में defind यह मैं इसे कैसे करना होगा और मुझे यकीन है कि यह Unity3D में संकलित हैं के लिए पता है। ऑफटाइप एकता में नहीं है, टाइपऑफ है लेकिन taras.roshko ने कहा है कि is का उपयोग करना बेहतर है।

MonoBehavior[] list; 

foreach(MonoBehavior current in list) // Search the whole list for MonoBehaviors. 
    if (current is Alpha)   // Check if current is an Alpha type. 
     current.doSomething();  // current is a valid Alpha type script. 

foreach सूची पर सभी तत्वों को परिवर्तित करने की कोशिश करेंगे और तब से अल्फा एक MonoBehavior है, लेकिन MonoBehavior अल्फा नहीं है आप इसे सही ढंग से नहीं चल सकता। तो आप जांचते हैं कि वर्तमान अल्फा है और फिर यदि इसका उपयोग किया जाता है तो आप इसे पसंद करते हैं।

0

अपने foreach बयान Alpha को वहाँ में हर वस्तु कास्ट करने के लिए कोशिश करेंगे करने के लिए नहीं दिया जा सकता। यदि उनके पास एक सामान्य सुपरक्लास है, तो आप इसका उपयोग कर सकते हैं, अन्यथा Object कक्षा का उपयोग करें।

2

उपयोग OfType निर्दिष्ट प्रकार के तत्वों से अधिक पुनरावृति करने के लिए केवल

13

आप की तरह कुछ की कोशिश कर सकते हैं: आप केवल Alpha प्रकार पर संचालित करने के लिए लूप चाहते हैं

foreach(Alpha a in list.Where(x => x is Alpha)) // Alpha is a script. 
    a.doSomething(); 
2

, तो आपको निम्न के रूप में फिर से लिखने की जरूरत है :

foreach (var item in list) 
{ 
    if (item is Alpha) 
    { 
    ((Alpha) item).doSomething(); 
    } 
} 

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

+0

'as' ऑपरेटर –

+0

का उपयोग करने के लिए एक बेहतर निर्णय होगा 'is' कीवर्ड का प्रभावी ढंग से' if (a.GetType == TypeOf (Alpha) '? – Amicable

+2

'है' विफल नहीं होगा अगर शून्य है (इसे गलत करने के लिए मूल्यांकन किया जाएगा), नल पर 'गेट टाइप' को कॉल करने के परिणामस्वरूप नल रेफरेंस अपवाद होगा, इसलिए 'है' दृष्टिकोण बेहतर है। लेकिन 'as' का उपयोग करना भी बेहतर है ऑपरेटर।अगला कदम 'ऑफ टाइप' LINQ विधि का उपयोग करना है) –

11

आप पॉलिमॉर्फिज्म पर गलत तरीके से जा रहे हैं: जबकि अल्फा एक व्युत्पन्न प्रकार है, आपकी सभी प्रकार की वस्तुओं में मोनोबिहियर नहीं हैं। इसलिए कुछ लोग अनुमानित प्रकार के कलाकारों को विफल कर देंगे जो foreach कर रहा है। आप "OfType()" एक्सटेंशन का उपयोग कर सकता है अगर यह अपने वातावरण में उपलब्ध है: अपनी सूची आधार प्रकार की सूची है और तुम सिर्फ प्रत्येक तत्व लेती हैं और उसे प्रकार के अल्फा है सोचने की कोशिश कर रहे हैं

foreach(Alpha a in list.OfType<Alpha>()) 
0

हैं की तुलना में यह है) के नीचे

foreach(Unity3d a in list) // Alpha is a script. 
    a.doSomething(); 

संभालने DoSomething (साथ अवैध कोशिश है Unity3D

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