2010-11-07 22 views
26

Type ऑब्जेक्ट को देखते हुए सबसे आसान तरीका क्या है, यह देखने के लिए कि यह वास्तव में वस्तुओं की एक सूची है या नहीं? अर्थात। ऐरे या आईनेमेरेबल/आईनेमेरेबल <>।यह कैसे बताने के लिए कि कोई प्रकार एक सूची या सरणी या IENumerable या

उत्तर

37

typeof(IEnumerable).IsAssignableFrom(type) देखें।

सरणी समेत प्रत्येक संग्रह प्रकार और IEnumerable<T>, IEnumerable लागू करता है।

+12

धन्यवाद - मैं, 'बाहर करने के लिए स्ट्रिंग' था, क्योंकि है कि' Char' की एक सरणी के रूप में आया था और मुझे लगता है कि नहीं चाहता था। :) –

+0

हां; मैं उसके बारे में भूल गया। – SLaks

+0

System.Xml.XmlText के साथ-साथ System.Xml.XmlNode के अन्य वंशजों को भी बाहर निकालें। –

-4

सरल। ऐसा करने के लिए सबसे आसान काम निम्नलिखित है:

IList<T> listTest = null; 

try{ 
    listTest = ((IList<T>)yourObject); 
} 
catch(Exception listException) 
{ 
    //your object doesn't support IList and is not of type List<T> 
} 

IEnumerable<T> enumerableTest = null; 

try{ 
    enumerableTest = ((IEnumerable<T>)yourObject); 
} 
catch(Exception enumerableException) 
{ 
    //your object doesn't suport IEnumerable<T>; 
} 

================================== ================

आप यह भी कोशिश कर सकते हैं जिसमें एकाधिक प्रयास/पकड़ ब्लॉक शामिल नहीं हैं। यह बेहतर है अगर आप उन लोगों का उपयोग करने से बच सकते हैं क्योंकि प्रत्येक शर्त वास्तव में रनटाइम के दौरान रनटाइम द्वारा मूल्यांकन की जाती है ... यह खराब कोड है (हालांकि कभी-कभी इसके आसपास कोई रास्ता नहीं है)।

Type t = yourObject.GetType(); 

if(t is typeof(List<OjbectType>)) //object type is string, decimal, whatever... 
{ 
    // t is of type List<ObjectType>... 
} 
else if(t is typeof(IEnumerable<ObjectType>) 
{ 
    // t is of type IEnumerable<ObjectType>... 
} 
else 
{ 
    // t is some other type. 
    // use reflection to find it. 
} 
+2

'listTest = ((IList ) yourObject करने के बजाय;' और अपवाद को पकड़ने के बजाय, आप केवल 'yourObject IList ' – Gabe

+2

वाह क्या गड़बड़ कर सकते हैं। यहां कम से कम चार चीजें बुरी तरह गलत हैं। (1) 'is' या' as' का उपयोग करने के बजाय अपवादों को पकड़ना। (2) 'अमान्यकास्टएक्सप्शन' के बजाय 'अपवाद' को पकड़ना। (3) दूसरे कोड ब्लॉक में, सोच रहा है कि सी # 'है 'वैसे ही काम करता है जैसे VB6' Is' - वास्तव में '==' सही ऑपरेटर है, लेकिन यह अभी भी असफल हो जाएगा क्योंकि (4) 'GetType()' हमेशा एक कंक्रीट क्लास लौटाता है, कभी भी इंटरफ़ेस जैसे 'आईनेमेरेबल ' –

0
if (objType.IsArray || objType.IsGenericType) 
{ 

} 
+1

' objType.IsGenericType' 'सत्य' वापस आ जाएगा, अगर यह' int 'है और 'Nullable ' 'IENumerable' या' Array' –

+0

@MatthiasBurger नहीं है मैंने इसका परीक्षण किया यह झूठा –

+0

@AlaMusleh यह वापस int के लिए सच है? –

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

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