2011-01-11 21 views
34

क्या सी # (.NET 2.0) में एक परावर्तित प्रकार से जेनेरिक ऑब्जेक्ट बनाना संभव है?सी # परावर्तक प्रकार से तत्काल सामान्य सूची

void foobar(Type t){ 
    IList<t> newList = new List<t>(); //this doesn't work 
    //... 
} 

टाइप, टी, रनटाइम तक ज्ञात नहीं है।

+0

क्या आप एक सूची आप संकलन समय पर के प्रकार पता नहीं है के साथ क्या करना उम्मीद करते हैं? – dtb

+1

क्या आप इसे सामान्य कार्य के रूप में लिखने में सक्षम हैं, जैसे 'void foobar () {IList newList = new list (); } ' – Juliet

+1

मुझे लगता है कि यह खराब तरीके से बड़ी समस्या से निपटने के परिणामस्वरूप एक कोड गंध हो सकता है। –

उत्तर

102

इस प्रयास करें:

void foobar(Type t) 
{ 
    var listType = typeof(List<>); 
    var constructedListType = listType.MakeGenericType(t); 

    var instance = Activator.CreateInstance(constructedListType); 
} 

अब क्या instance से कोई लेना देना?

// Now you have a list - it isn't strongly typed but at least you 
// can work with it and use it to some degree. 
var instance = (IList)Activator.CreateInstance(constructedListType); 
+6

+1 'टाइपऑफ (सूची <>)', I के लिए +1 पहले यह नहीं देखा था। –

+0

नेट फ्रेमवर्क 2.0 में 'var' मौजूद है ?! –

+0

@sprocketonline: 'var' एक सी # 3 सुविधा है, इसलिए यदि आप सी # 2 का उपयोग कर रहे हैं तो आपको अपने चर को स्पष्ट रूप से घोषित करने की आवश्यकता होगी। अच्छे पुराने गैर सामान्य समर्थित इंटरफेस याद रखने के लिए –

0

आप उपयोग कर सकते हैं: चूंकि आप अपनी सूची की सामग्री के प्रकार पता नहीं है, शायद सबसे अच्छी बात तुम कर सकते हो एक IList रूप instance कास्ट करने के लिए तो आप सिर्फ एक object के अलावा कुछ हो सकता है हो सकता है ऐसे परिचालनों के लिए MakeGenericType

प्रलेखन के लिए, here और here देखें।

6
static void Main(string[] args) 
{ 
    IList list = foobar(typeof(string)); 
    list.Add("foo"); 
    list.Add("bar"); 
    foreach (string s in list) 
    Console.WriteLine(s); 
    Console.ReadKey(); 
} 

private static IList foobar(Type t) 
{ 
    var listType = typeof(List<>); 
    var constructedListType = listType.MakeGenericType(t); 
    var instance = Activator.CreateInstance(constructedListType); 
    return (IList)instance; 
} 
+0

+1 :) – leppie

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