2010-10-08 9 views
7

मान लें कि मेरे पास एक कक्षा है जो रनटाइम तक अज्ञात है। रनटाइम पर मुझे Foo.GetType() पर संदर्भ संदर्भ प्रकार का संदर्भ मिलता है, x। केवल एक्स और सूची <> का उपयोग कर, क्या मैं फू प्रकार की सूची बना सकता हूं?सूची <T> को तुरंत चालू करने के लिए कैसे करें लेकिन टी रनटाइम तक अज्ञात है?

यह कैसे करें?

+3

आपको कुछ भी 'सूची ' बनाने से रोक रहा है? – Flynn1179

+0

@ Flynn1179, मुझे देखने दो कि आप इसे कैसे करते हैं। – xport

+0

'सूची myList = नई सूची (); ' – Flynn1179

उत्तर

19
Type x = typeof(Foo); 
Type listType = typeof(List<>).MakeGenericType(x); 
object list = Activator.CreateInstance(listType); 

बेशक आप किसी भी प्रकार की सुरक्षा यहाँ उम्मीद नहीं करनी चाहिए के रूप में जिसके परिणामस्वरूप सूची है संकलन समय पर object टाइप करें। List<object> का उपयोग करना अधिक व्यावहारिक होगा लेकिन अभी भी सीमित प्रकार की सुरक्षा होगी क्योंकि Foo का प्रकार केवल रनटाइम पर जाना जाता है।

+0

अच्छा! आपका उत्तर यह भी सुझाता है (सही ढंग से) कि इस तरह की सूची के साथ काम करना काफी प्रकार का असुरक्षित होगा। निश्चित रूप से, 'सूची' को 'गैर-सामान्य) प्रकार' आईएलआईस्ट 'या' आईसीओलेक्शन' (केवल 'ऑब्जेक्ट' के बजाय) के रूप में घोषित किया जा सकता है, इसके साथ ही 'एक्टिवेटर। क्रिएट इंस्टेंस' की वापसी की इसी कलाकार के साथ मान, ताकि संग्रह के रूप में 'सूची' के साथ काम करने का सीमित तरीका संभव हो। – stakx

+2

यदि आप रनटाइम पर प्रकार बनाते हैं, तो सुनिश्चित करें कि कोई संकलन-समय प्रकार सुरक्षा नहीं हो सकती है। – Frank

0

कुछ इस तरह:

Activator.CreateInstance (typeof (सूची <>) MakeGenericType (प्रकार)।)

11

सुनिश्चित करें कि आप कर सकते हैं:

var fooList = Activator 
    .CreateInstance(typeof(List<>) 
    .MakeGenericType(Foo.GetType())); 

समस्या यहां है कि fooList है object टाइप करें ताकि आपको अभी भी इसे "उपयोग करने योग्य" प्रकार में डालना होगा। लेकिन यह प्रकार कैसा दिखता है? TList<T> (या बल्कि IList<>) की वस्तुओं को जोड़ने और देखने का समर्थन करने वाली डेटा संरचना के रूप में T में कॉन्वेंट नहीं है, इसलिए आप List<Foo> को List<IFoo> पर Foo: IFoo पर नहीं डाल सकते हैं। आप इसे IEnumerable<T> पर डाल सकते हैं जो T में कॉन्वर्सेंट है।

यदि आप सी # 4.0 का उपयोग कर रहे हैं तो आप fooList को dynamic पर कास्टिंग करने पर भी विचार कर सकते हैं ताकि आप इसे कम से कम एक सूची के रूप में उपयोग कर सकें (उदा। जोड़ें, देखो और ऑब्जेक्ट हटाएं)।

इस सब और तथ्य को ध्यान में रखते हुए, कि आपके पास रनटाइम पर प्रकार बनाने के दौरान किसी भी संकलन-समय की सुरक्षा नहीं है, बस List<object> का उपयोग करके शायद इस मामले में जाने का सबसे अच्छा/सबसे व्यावहारिक तरीका है।

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

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