2009-12-14 21 views
7

के माध्यम से संग्रह में निहित प्रकार कैसे प्राप्त करें मेरे कोड के कुछ हिस्सों में मुझे T प्रकार की वस्तुओं का संग्रह पारित किया गया है। मुझे नहीं पता कि कौन सा कंक्रीट कोललेशन पारित किया जाएगा, इसके अलावा IEnumerable को प्रभावित करता है।प्रतिबिंब

रन टाइम पर, मुझे यह पता लगाना होगा कि किस प्रकार का टी है (उदा। System.Double, System.String, आदि ...)।

क्या इसे खोजने का कोई तरीका है?

अद्यतन: मुझे शायद उस संदर्भ में कुछ और स्पष्ट करना चाहिए जो मैं काम कर रहा हूं (एक लिंक प्रदाता)।

string GetSymbolForType(Type collectionType) 
{ 

} 

वहाँ collectionType से किसी भी तरह से निहित वस्तुओं टाइप प्राप्त करने के लिए है: जहां मैं एक पैरामीटर के रूप में संग्रह के प्रकार के मिल

मेरे समारोह, निम्नलिखित की तरह एक हस्ताक्षर है?

+1

आप जेनेरिक संग्रह में केवल निहित वस्तुओं का प्रकार प्राप्त कर सकते हैं। यदि आप क्लासिक संग्रह के साथ काम करते हैं तो आपके पास वस्तुओं पर पुनरावृत्ति के अलावा अन्य लोगों के लिए एक अच्छा मौका नहीं होगा और विशेष रूप से उनके प्रकार के लिए पूछें। –

उत्तर

14

Matt Warren's Blog से:

internal static class TypeSystem { 
    internal static Type GetElementType(Type seqType) { 
     Type ienum = FindIEnumerable(seqType); 
     if (ienum == null) return seqType; 
     return ienum.GetGenericArguments()[0]; 
    } 
    private static Type FindIEnumerable(Type seqType) { 
     if (seqType == null || seqType == typeof(string)) 
      return null; 
     if (seqType.IsArray) 
      return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType()); 
     if (seqType.IsGenericType) { 
      foreach (Type arg in seqType.GetGenericArguments()) { 
       Type ienum = typeof(IEnumerable<>).MakeGenericType(arg); 
       if (ienum.IsAssignableFrom(seqType)) { 
        return ienum; 
       } 
      } 
     } 
     Type[] ifaces = seqType.GetInterfaces(); 
     if (ifaces != null && ifaces.Length > 0) { 
      foreach (Type iface in ifaces) { 
       Type ienum = FindIEnumerable(iface); 
       if (ienum != null) return ienum; 
      } 
     } 
     if (seqType.BaseType != null && seqType.BaseType != typeof(object)) { 
      return FindIEnumerable(seqType.BaseType); 
     } 
     return null; 
    } 
} 
+1

यह चाल है। धन्यवाद। –

0
Type t = null 
foreach(object o in list) 
{ 
o.GetType(); 
} 

आपको ऑब्जेक्ट का प्रकार मिलेगा।

तो फिर तुम शायद अपने वांछित प्रकार के लिए परीक्षण करना चाहिए:

if(t == typeof(myClass)) 
{ 
dosomething(); 
} 
else if (t == typeof(myOtherClass)) 
{ 
dosomethingelse(); 
} 
0

नहीं कर सकते तो आप सिर्फ t.GetType() यह करने के लिए इस्तेमाल करते हैं।

0

क्यों न केवल IEnumerable<T> लागू करें? ईजी:

public void MyFunc<T>(IEnumerable<T> objects)

उसके अलावा, आप प्रत्येक व्यक्ति के बजाय कंटेनर से ही इस पर काम करने के लिए कोशिश कर रहा से is या .GetType का उपयोग कर वस्तु के प्रकार की जाँच के बेहतर होगा।

यदि यह कोई विकल्प नहीं है और आपको वास्तव में बेस कंटेनर के प्रकार को जानने की आवश्यकता है तो आपको मूल रूप से is का उपयोग करके जांच करना होगा कि यह कौन सा इंटरफेस लागू करता है (ईजी: IList<int> आदि)। बाधाएं आपकी सरणी का प्रकार एक सामान्य होने जा रहा है जिसका अर्थ है कि इसका नाम वापस अपने डेटा प्रकार से वापस करने की कोशिश करना काफी गन्दा होगा।

8
myCollection.GetType().GetGenericArguments() 

प्रकार तर्कों की एक सरणी वापस कर देगा।

+4

केवल सामान्य प्रकारों पर काम करता है। –

0

खैर मैं देर से यहाँ जिस तरह से जिस तरह से कर रहा हूँ, लेकिन ऐसा करना चाहिए नहीं इस काम:

public static bool ThatCollectionIsOfType<T>(IEnumerable<T> collection, Type got) 
    { 
     if (**typeof(T)** == got) //this line should be good to go... 
     { 
      return true; 
     } 

    } 
0

मैं गतिशील बहुत का उपयोग करें और यह समय-समय पर एक मुद्दा है।

मैट डेविस इसे किसी न किसी लेकिन आप सूचकांक :)

public static void PopulateChildCollection<T>(T currentObject, string singlePropertyName) 
{ 
    dynamic currentObjectCollection = ReflectionTools.GetPropertyValue(currentObject, singlePropertyName); 
    Type collectionType = currentObjectCollection.GetType().GetGenericArguments()[0]; 

प्रकार आप क्या उम्मीद करेंगे हो जाएगा, यह वस्तु के प्रकार के संग्रह में शामिल नहीं है और आसपास के सामान्य प्रकारों में से किसी की जरूरत है यह।संग्रह प्रकार से