2010-03-22 17 views
19

की सूची बनाएं मैं एक निश्चित प्रकार की सूची बनाने की कोशिश कर रहा हूं।वैरिएबल प्रकार

मैं सूची संकेतन का उपयोग करना चाहते हैं लेकिन सब मुझे पता है एक "System.Type"

प्रकार एक चर है है। मैं एक चर प्रकार की सूची कैसे बना सकता हूं?

मुझे इस कोड के समान कुछ चाहिए।

Type mytype = typeof (int); 

    Type listGenericType = typeof (List<>); 

    Type list = listGenericType.MakeGenericType(mytype); 

    ConstructorInfo ci = list.GetConstructor(new Type[] {}); 

    List<int> listInt = (List<int>)ci.Invoke(new object[] {}); 
+2

सुनिश्चित करें कि कोई दोषपूर्ण डिज़ाइन नहीं है, क्योंकि यह एक जैसा है। – Dykam

उत्तर

14

आप कुछ विचार इस्तेमाल कर सकते हैं, यहाँ एक नमूना है।

public IList createList(Type myType) 
{ 
    Type genericListType = typeof(List<>).MakeGenericType(myType); 
    return (IList)Activator.CreateInstance(genericListType); 
} 
+0

समस्या यह है कि हम नहीं जानते कि MyType टाइपऑफ (int) है, इसलिए आपका अंतिम विवरण सूची नहीं हो सकता है, हम लीर जैसे कुछ चाहेंगे, लेकिन निश्चित रूप से ऐसा नहीं किया जा सकता है। उदाहरण बनाने के लिए हमें System.Activator.CreateInstance (myType) का उपयोग करना चाहिए। लेकिन फिर फिर, वापसी मूल्य अगर MyType प्रकार का ऑब्जेक्ट। और आपको सिस्टम का उपयोग करना होगा। विधियों/गुणों/इंटरफेस इत्यादि के बारे में जानने के लिए टाइप करें –

+0

यह जेनरिक का उपयोग करके किया जा सकता है: सूची CreateMyList ()। इस विधि के अंदर आप कर सकते हैं: MyType = typeof (T) टाइप करें; और फिर सब कुछ ऊपर के रूप में। आप इस तरह की विधि का उपयोग करने में सक्षम होंगे: सूची सूची = बनाएँसूची () –

33

कुछ इस तरह काम करना चाहिए:

public IList createListOfMyType(Type myType) 
{ 
    return new List<myType>(); 
} 
+0

धन्यवाद, इसने मेरी समस्या हल की। – Jan

+0

मुझे इसे काम करने से पहले थोड़ा सा इसके साथ घूमना पड़ा। मैं टाइप का उपयोग करने के लिए कुल नौसिखिया हूं, इसलिए यहां एक कोड स्निपेट है अन्य लोगों को सहायक मिल सकता है जहां आप इस मुख्य सूची या किसी अन्य विधि से इस बिल्डलिस्ट विधि को कॉल करते हैं: स्ट्रिंग [] शब्द = {"सामान", "चीज़ें" , "wordz", "Misc"}; var shtuff = createList (words.GetType()); –

+1

मुझे एहसास है कि यह पुराना है, लेकिन @ जेन, यह आपकी समस्या को हल करता है इसे उत्तर के रूप में चिह्नित किया जाना चाहिए। @kayleeFrye_onDeck आप केवल 'टाइपऑफ (स्ट्रिंग []) ' – 182764125216

0

धन्यवाद! यह एक बड़ी मदद थी। एंटिटी फ्रेमवर्क के लिए मेरा कार्यान्वयन यहां दिया गया है:

public System.Collections.IList TableData(string tableName, ref IList<string> errors) 
    { 
     System.Collections.IList results = null; 

     using (CRMEntities db = new CRMEntities()) 
     { 
      Type T = db.GetType().GetProperties().Where(w => w.PropertyType.IsGenericType && w.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Entity.DbSet<>)).Select(s => s.PropertyType.GetGenericArguments()[0]).FirstOrDefault(f => f.Name == tableName); 
      try 
      { 
       results = Utils.CreateList(T); 
       if (T != null) 
       { 
        IQueryable qrySet = db.Set(T).AsQueryable(); 
        foreach (var entry in qrySet) 
        { 
         results.Add(entry); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       errors = Utils.ReadException(ex); 
      } 
     } 

     return results; 
    } 

    public static System.Collections.IList CreateList(Type myType) 
    { 
     Type genericListType = typeof(List<>).MakeGenericType(myType); 
     return (System.Collections.IList)Activator.CreateInstance(genericListType); 
    } 
संबंधित मुद्दे