2010-09-24 15 views
9

एक पहेली की बिट, मैं एक सामान्य वर्गजेनेरिक वर्ग और Type.GetType()

public abstract class MyClass<T> : UserControl 
{ 

} 

है और मैं इस

Type type = Type.GetType("Type From DB as String", true, true); 

की तरह एक प्रकार मिल गया है और मैं बनाना चाहते हैं और उदाहरण प्रकार का उपयोग कर MyClass का ... लेकिन यह काम नहीं करता है।

MyClass<type> control = (MyClass<type>)LoadControl("/UsercControl.ascx"); 

कोई विचार ????

+0

मैं एक आईओसी का उपयोग करूंगा। कोड एक तंग पाश में है? – Luke101

+0

यह कैसे करें इस पर कोई विचार? – Andy

उत्तर

0

आप प्रतिबिंब का उपयोग कर नई वस्तुओं बनाएँ:

type.GetConstructor(new Type[]{}).Invoke(new object[]{}); 
1

प्रतिबिंब में जेनिक्स इस से थोड़ा अधिक जटिल हैं। आप जो खोज रहे हैं वह GetGenericTypeDefinition() और MakeGenericType() विधियां हैं। अपना सामान्य प्रकार लें (आप इसे उदाहरण के लिए GetType() पर कॉल करके या टाइपफ़ोफ़ (MyClass<Object>) का उपयोग करके प्राप्त कर सकते हैं, और मूल, खुले जेनेरिक प्रकार (MyClass<T>) प्राप्त करने के लिए GetGenericTypeDefinition() को कॉल कर सकते हैं। फिर, उस प्रकार, MakeGenericType() को कॉल करें और इसे एक तत्व के साथ एक सरणी पास करें; जेनेरिक को बंद करने के लिए आप जिस प्रकार का उपयोग करना चाहते हैं। इससे आपको अपने गतिशील रूप से खोजे गए प्रकार (MyClass<MyType>) के साथ एक सामान्य प्रकार बंद हो जाएगा, जिसे आप एक्टिवेटर को पास कर सकते हैं। क्रिएट इंस्टेंस()।

14

कुछ इस तरह:

Type typeArgument = Type.GetType("Type From DB as String", true, true); 
Type template = typeof(MyClass<>); 
Type genericType = template.MakeGenericType(typeArgument); 
object instance = Activator.CreateInstance(genericType); 

अब आप उपयोग करने में सक्षम नहीं होगा कि उस पर तरीकों बुला, क्योंकि आप T पता नहीं है के मामले में एक MyClass<T> के रूप में ... लेकिन आप कुछ विधियों के साथ गैर-जेनेरिक बेस क्लास या इंटरफेस को परिभाषित कर सकते हैं जिसमें T की आवश्यकता नहीं है, और उस पर डाला गया है। या आप प्रतिबिंब के माध्यम से इस पर तरीकों को बुला सकते हैं।

+0

मैं इसी तरह के कोड पोस्ट करने जा रहा था, लेकिन मुझे यकीन नहीं है कि आप परिणाम का उपयोग कैसे करेंगे। क्या आप प्रतिबिंब के लिए बाध्य हैं? (आह, आपने मेरे विचारों की पुष्टि करने के लिए और अधिक टेक्स्ट जोड़ा है।) –

+0

आप निश्चित रूप से इसे MyClass के रूप में उपयोग कर सकते हैं, क्योंकि आप टी को जानते हैं। प्रकार के नाम को देखें और आप देखेंगे कि यह जेनेरिक क्लास नाम का मैशप है और पैरामीटर प्रकार। हालांकि, मुझे नहीं लगता कि टाइपऑफ (MyClass <>) कानूनी है; आपको एक प्रकार का बंद करना होगा, फिर GetGenericTypeDefinition का उपयोग करके इसे बाहर निकालें) – KeithS

+0

@KeighS, जॉन का कोड ('टाइपऑफ (MyClass <>)' निश्चित रूप से काम करता है। अपने लिए यह परीक्षण करें। –

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