2009-05-27 12 views
13

मैं कैसे यह संभव है के बारे में एक सवाल मिल गया है (संभव :) एक प्रकार संदर्भ Type.GetType द्वारा दिया उपयोग करने के लिए करता है, तो() के लिए, उदाहरण के लिए, IList बनाने उस प्रकार का?का उपयोग कर प्रकार C# में Type.GetType() द्वारा दिया

Type customer = Type.GetType("myapp.Customer"); 
IList<customer> customerList = new List<customer>(); // got an error here =[ 

अग्रिम धन्यवाद:

यहाँ नमूना कोड है!

+0

IList एक इंटरफेस है, तो आप नए यह नहीं कर सकता। आपको नए प्रकार की आवश्यकता है जो IList जैसे सूची लागू करता है। –

उत्तर

21

कुछ इस तरह:

Type listType = typeof(List<>).MakeGenericType(customer); 
IList customerList = (IList)Activator.CreateInstance(listType); 

बेशक आप के रूप में

IList<customer> 

यह घोषणा नहीं कर सकता क्योंकि यह संकलन समय पर परिभाषित नहीं है। लेकिन List<T> IList लागू करता है, तो आप इसका उपयोग कर सकते हैं।

+3

हाँ, क्योंकि यह संकलन समय पर परिभाषित नहीं कर रहा है, वहाँ नहीं एक सामान्य सूची <> का प्रयोग करने में ज्यादा बात है - आप के रूप में अच्छी तरह के ArrayList के रूप में एक गैर सामान्य कंटेनर का उपयोग हो सकता है। – Grokys

+0

दरअसल आपको एक्टिवेटर का परिणाम डालना चाहिए। क्रिएटइंस्टेंस को IList में, क्योंकि यह ऑब्जेक्ट देता है ... –

+1

@ थॉमस: धन्यवाद, इसे ठीक किया गया। @ ग्रोकी: यह निर्भर करता है। जेनेरिक सूची का उपयोग करके आप आइटम जोड़ते समय रनटाइम प्रकार चेक प्राप्त करते हैं। या आपको इसे उस क्षेत्र में असाइन करने की आवश्यकता है जिसे आप जानते हैं (कुछ संदर्भ से) कि यह एक ही प्रकार का है। –

0

आपकी समस्या का समाधान स्टीफन द्वारा पहले ही प्रदान किया गया है।

कारण आप IList<customer> नहीं कर सकते हैं क्योंकि आप इस तरह संकलित समय और रन-टाइम प्रकारों को मिश्रित नहीं कर सकते हैं। जब मैं इस तरह कुछ के बारे में तर्क करने का प्रयास करता हूं तो एक संकेत यह है कि: इंटेलिजेंस कैसे पता लगा सकता है कि सदस्यों को यह दिखाना चाहिए। आपके उदाहरण में इसे केवल रनटाइम पर हल किया जा सकता है।

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

+0

के रूप में स्टीफन उसके जवाब के लिए टिप्पणी में कहा कि अभी भी इस तरह के सूची में विभिन्न प्रकार की वस्तुओं को जोड़ने से कोड को रोकने सामान्य सूची के रूप में advandages, कर रहे हैं। यद्यपि आप इंटेलिजेंस खो देते हैं। –

2

मैं हाल ही में पेश आ रही इस problem..I जानते हैं कि यह वर्ष सवाल है, लेकिन सोचा था कि किसी को उपयोगी समाधान मैंने पाया पर मिले (शुद्ध का उपयोग कर 4.0)।

public static dynamic GetRealType { ISomeInterface param } { 
    return Activator.CreateInstance("dllname", param.GetEntityType); 
} 

वस्तु बनाना के रूप में एक गतिशील प्रकार क्या यह मेरे लिए हल किया गया था:

public interface ISomeInterface{ 
    String GetEntityType{ get; } 
} 

public abstract class BaseClass : ISomeInterface{ 
    public String GetEntityType { 
      get{ return this.GetType().ToString(); } 
    } 
} 

public class ChildA : BaseClass { } 

public class ChildB : BaseClass { } 

क्या मैंने किया था एक कारखाने विधि बनाने था: इस सेटअप मैं था। मैं एक विधि होने से प्रकार निष्कर्ष निकाला:

public void DoSomething<T>(T param){ 

    IList<T> list = somecode... 
} 

यह मेरे विधि के लिए एक कॉल करते हैं और .net प्रकार यह निष्कर्ष निकाल जाने के लिए अनुमति दी

public void myMethod(ISomeInterface param) { 
    dynamic value = Factory.GetRealType (param); 
    DoSomething(value); 
} 

आशा है कि मैं यह सब भ्रमित नहीं लिया और उसके यह वास्तव में मदद करता है, भी, पाठ की दीवार के लिए खेद है

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