2012-01-03 15 views
9

मुझे लगता है कि गतिशील usercontrols का उपयोग कर एक वेब पेज बनाता है एक वेब अनुप्रयोग है।Type.GetType() लौट अशक्त

मेरी कोड के भीतर मैं निम्नलिखित है:

private void Render_Modules() 
    { 
     foreach (OnlineSystemPageCustom.OnlineSystemPageHdr.OnlineSystemPageModule item in custompage.Header.Modules) 
     { 
      if (item.ModuleCustomOrder != 99 && !item.ModuleOptional) 
      { 
       string typeName = item.ModuleInternetFile; 
       Type child = Type.GetType(typeName); 
       webonlinecustombase ctl = (webonlinecustombase)Page.LoadControl("../IPAM_Controls/webtemplatecontrols/" + child.Name.ToString() + ".ascx"); 
       ctl.Event = Event; 
       ctl.custompage = custompage; 
       ctl.custommodule = item; 
       this.eventprogrammodules.Controls.Add(ctl); 
      } 
     } 
    } 

"TypeName" जाता है कि वापस आ रहा है (उदाहरण) है:

IPAMIntranet.IPAM_Controls.webtemplatecontrols.eventorgcommittee

उपयोगकर्ता नियंत्रण के लिए नाम स्थान इस प्रकार है :

namespace IPAMIntranet.IPAM_Controls 

मेरी समस्या यह है कि टी ype.GetType (typeName) शून्य लौट रहा है। मुझे यहां क्या समझ नहीं आ रहा है?

+0

हाँ खेद मेरी टाइपिंग त्रुटि, मैं अशक्त – mattgcon

उत्तर

24

Type.GetType(string) केवल वर्तमान में निष्पादित असेंबली और mscorlib में दिखता है जब आप स्ट्रिंग के भीतर असेंबली नाम निर्दिष्ट नहीं करते हैं।

विकल्प:

  • उचित विधानसभा पर विधानसभा से योग्य नाम के बजाय
  • कॉल Assembly.GetType(name) का प्रयोग करें बजाय

आप प्रासंगिक विधानसभा की पकड़ होने का एक आसान तरीका है, तो (जैसे typeof(SomeKnownType).Assembly के माध्यम से) तो दूसरा विकल्प शायद आसान है।

+0

विधानसभा से योग्य नाम का मतलब? मुझे वह कहां मिल सकता है? ये कस्टम उपयोगकर्ता नियंत्रण हैं जिन्हें मैंने वेब एप्लिकेशन के भीतर बनाया है यदि यह – mattgcon

+2

@mattgcon में मदद करता है: आप 'Type.AssemblyQualifiedName' का उपयोग कर सकते हैं, लेकिन यदि आप जानते हैं कि यह एक विशिष्ट असेंबली के लिए है, तो आप' typeof (SomeClassInTheAssembly) का उपयोग कर सकते हैं। उस असेंबली को पाने के लिए, फिर 'असेंबली.गेट टाइप (स्ट्रिंग)' का उपयोग करें। इससे कोई फर्क नहीं पड़ता कि आप किस वर्ग को असेंबली से इसका संदर्भ प्राप्त करने के लिए उपयोग करते हैं। –

+0

बाद मैं विधानसभा तो मिल मैं क्या करूँ? = Assembly.GetType (TypeName) उपयोगकर्ता नियंत्रण पाने के लिए मैं प्रकार बच्चे राज्य है? – mattgcon

4

टाइप। गेट टाइप असेंबली और कुछ सिस्टम असेंबली को कॉल करने के रूप में दिखता है। कुछ और के लिए, आप या तो assemblyInstance.GetType(typeName) का उपयोग करना चाहिए, या आप प्रकार है, जो विधानसभा विवरण जिसमें प्रकार पाया जा सकता है शामिल की "विधानसभा योग्य नाम" का उपयोग करना चाहिए। अन्यथा, यह नहीं मिलेगा, और शून्य वापस आ जाएगा।

string aqn = someType.AssemblyQualifiedName; 
+0

मैं कैसे उपयोगकर्ता के लिए विधानसभा योग्य नाम – mattgcon

+0

@mattgcon मैं भी शामिल है कि someType मेरी typeName है अगर answerr –

+0

में नियंत्रित करता मिलता है ।।, मैं कहना है कि typeName गतिशील होने जा रहा है है और मैं पता नहीं क्या यह डिजाइन समय के दौरान है – mattgcon

0

मैं मूल रूप से पोस्ट करने के लिए एक बहुत ही इसी तरह की समस्या थी, सिवाय इसके कि मैं एक ASPX के बजाय एक स्थिर उपयोगिता कक्षा में कोड-पीछे अपने कस्टम उपयोगकर्ता के नियंत्रण के वर्ग का दृष्टांत करने की जरूरत: आप कि से प्राप्त कर सकते हैं पेज, तो लोडकंट्रोल मेरे लिए उपलब्ध नहीं था।

public static class Utils 
{ 
    public static string MyFunc(string controlClassName) 
    { 
     string result = ""; 
     // get a list of all assemblies in this application domain 
     Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
     // the trouble is that we don't know which assembly the class is defined in, 
     // because we are using the "Web Site" model in Visual Studio that compiles 
     // them on the fly into assemblies with random names 
     // -> however, we do know that the assembly will be named App_Web_* 
     // (http://msdn.microsoft.com/en-us/magazine/cc163496.aspx) 
     foreach (Assembly assembly in assemblies) 
     { 
      if (assembly.FullName.StartsWith("App_Web_")) 
      { 
       // I have specified the ClassName attribute of the <%@ Control %> 
       // directive in the relevant ASCX files, so this should work 
       Type t = assembly.GetType("ASP." + controlClassName); 
       if (t != null) 
       { 
        // use reflection to create the instance (as a general object) 
        object o = Activator.CreateInstance(t); 
        // cast to the common base type that has the property we need 
        CommonBaseType ctrl = o as CommonBaseType; 
        if (ctrl != null) 
        { 
         foreach (string key in ctrl.PropertyWeNeed) 
         { 
          // finally, do the actual work 
          result = "something good"; 
         } 
        } 
       } 
      } 
     } 
     return result; 
    } 
} 

यह बहुत नहीं और न बहुत ही कुशल है, और अगर App_Web_ * नामकरण सम्मेलन में परिवर्तन (यद्यपि आप तो बस उन सभी के माध्यम से दिखाई दे सकता है) को तोड़ने के लिए उत्तरदायी है: यह करता है, लेकिन यहाँ मैं क्या कर समाप्त हो गया है काम ...

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