2012-06-02 25 views
25

मैं यह निर्धारित करने की कोशिश कर रहा हूं कि रनटाइम प्रकार किसी प्रकार का संग्रह प्रकार है या नहीं। मेरे पास नीचे क्या काम है, लेकिन यह अजीब लगता है कि मुझे उन प्रकारों का नाम देना है जिन्हें मैं संग्रहित प्रकारों के रूप में मानता हूं जैसे मैंने किया है।यह निर्धारित करने के लिए कि कोई प्रकार संग्रह का प्रकार है या नहीं?

नीचे दिए गए कोड में, सामान्य तर्क का कारण यह है कि, मेरे ऐप में, मैं उम्मीद करता हूं कि सभी संग्रह सामान्य हों।

bool IsCollectionType(Type type) 
{ 
    if (!type.GetGenericArguments().Any()) 
     return false; 

    Type genericTypeDefinition = type.GetGenericTypeDefinition(); 
    var collectionTypes = new[] { typeof(IEnumerable<>), typeof(ICollection<>), typeof(IList<>), typeof(List<>) }; 
    return collectionTypes.Any(x => x.IsAssignableFrom(genericTypeDefinition)); 
} 

मैं इस कोड को बेहतर या सरल बनाने के लिए कैसे प्रतिक्रिया दूंगा?

+0

एक बात है कि आप आमतौर पर नहीं 'स्ट्रिंग'' char's का एक संग्रह के रूप में विचार करने के लिए, भले ही यह लागू करता है 'IEnumerable ' चाहते हैं। – svick

उत्तर

48

वास्तव में इन सभी प्रकारों में IEnumerable का उत्तराधिकारी है। आप इसके लिए केवल देख सकते हैं:

  • List<T>

  • : "सिंटेक्स" भाग में

    bool IsCollectionType(Type type) 
    { 
        return (type.GetInterface(nameof(ICollection)) != null); 
    } 
    

    देखो:

    bool IsEnumerableType(Type type) 
    { 
        return (type.GetInterface(nameof(IEnumerable)) != null); 
    } 
    

    या तुम सच में ICollection के लिए जाँच करने की जरूरत है

    IList

  • ICollection

+0

हाहा। यह वास्तव में इतना आसान था। किसी कारण से मैंने सोचा कि काम नहीं करेगा और मैंने कोशिश नहीं की। –

+1

डॉक्टर में विरासत पदानुक्रम आपको इंटरफेस लागू नहीं करता है। लेकिन सिंटेक्स अनुभाग को देखकर होगा। – svick

+0

@svick: IList , ICollection , \t IEnumerable , IList, ICollection, IEnumerable : सार्वजनिक वर्ग सूची बारे में क्या? – Ruben

2

आप एक प्रकार एक खुला सामान्य इंटरफ़ेस लागू करता है, तो जाँच करने के लिए इस सहायक विधि का उपयोग कर सकते हैं। आपके मामले में आप DoesTypeSupportInterface(type, typeof(Collection<>))

public static bool DoesTypeSupportInterface(Type type,Type inter) 
{ 
    if(inter.IsAssignableFrom(type)) 
     return true; 
    if(type.GetInterfaces().Any(i=>i. IsGenericType && i.GetGenericTypeDefinition()==inter)) 
     return true; 
    return false; 
} 

उपयोग कर सकते हैं या आप बस गैर सामान्य IEnumerable के लिए देख सकते हैं। सभी संग्रह इंटरफेस इसके उत्तराधिकारी हैं। लेकिन मैं किसी भी प्रकार को कॉल नहीं करता जो IEnumerable को एक संग्रह लागू करता है।

+0

या समाधान [यहां पाए गए] का उपयोग करें (http://stackoverflow.com/a/1075059/122781) जो जेनेरिक इंटरफेस के अतिरिक्त जेनेरिक प्रकारों के लिए काम करता है। – HappyNomad

1

वे सब के सब IEnumerable(), जिसका अर्थ है की जाँच its there पर्याप्त होना चाहिए वारिस IEnumerable

+3

तो स्ट्रिंग को झूठी सकारात्मक – War

0

आप की तरह

yourobject.GetType().GetInterfaces().Where(s => s.Name == "IEnumerable") 

एक अंतरफलक नाम के लिए खोज इस मान हैं तो LINQ उपयोग कर सकते हैं की एक उदाहरण है:

+3

की ओर अग्रसर करता है तो स्ट्रिंग को झूठी सकारात्मक – War

2

मुझे पता है कि यह धागा पुराना है लेकिन माइक्रोसॉफ्ट is कीवर्ड के अनुसार 20 जुलाई, 2015 के रूप में यह एक आधुनिक उदाहरण है। ध्यान में रखने की

if(collection is ICollection) return true; 
+0

तक ले जाता है प्रश्न यह निर्धारित करने के लिए है कि * * * एक संग्रह है, ऑब्जेक्ट उदाहरण नहीं है। –

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

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