2011-09-16 18 views
6

मेरे कोडType.GetType (स्ट्रिंग TypeName) रिटर्न अशक्त

type = Type.GetType(key); 

कुंजी जो मैं पारित एक namespace योग्य नाम है।

मेरा कोड BusinessLayer में है। मैं DataAccessLayer का एक उदाहरण बना रहा हूं। DataAccessLayer संदर्भ BusinessLayer में जोड़ा गया है।

मैं के रूप में त्रुटि हो रही है "विधानसभा से प्रकार लोड नहीं कर सका Catalyst.DAL.ExamDAO.CExamDAO '' BusinessLayer, संस्करण = 1.9.3.0, संस्कृति = तटस्थ, PublicKeyToken = अशक्त '।"

क्लास DataAccessLayer से स्पष्ट रूप से निर्दिष्ट करने के लिए मुझे क्या करना चाहिए?

कुंजी घाटी "Catalyst.DAL.ExamDAO.CExamDAO" है

संपादित करें:

मेरे वास्तविक कोड

public static object getClassInstance(string key, params object[] constructorArgs) 
     { 
      string assemblyPath = null; 
      string customClassName = null; 
      DataSet objDataset = getAssemblyInfo(key); 
      if (objDataset != null && objDataset.Tables.Count > 0 && objDataset.Tables[0].Rows.Count > 0) 
      { 
       assemblyPath = objDataset.Tables[0].Rows[0]["ACA_ASSEMBLY_PATH"].ToString(); 
       customClassName = objDataset.Tables[0].Rows[0]["ACA_CLASS_NAME"].ToString(); 
      } 

      Assembly assembly; 
      Type type; 

      if (assemblyPath != null && assemblyPath != string.Empty) 
      { 
       assembly = Assembly.LoadFile(assemblyPath); 
       type = assembly.GetType(customClassName); 
      } 
      else // if no customisation 
      { 
       type = Type.GetType(key); 
      } 

      object classInstance = constructorArgs == null ? Activator.CreateInstance(type) : Activator.CreateInstance(type, constructorArgs); 
      if (classInstance == null) throw new Exception("broke"); 
      return classInstance; 

     } 

मैं डिफ़ॉल्ट कक्षाओं लोड करने के लिए अगर कोई है कोशिश कर रहा हूँ है कोई अनुकूलन नहीं। विधि बीओ में है। यदि मैं किसी भी बो प्रकार के नामस्थान योग्य नामों के रूप में कुंजी पास करता हूं तो यह परिवर्तित हो जाता है। लेकिन डीएओ टाइप करें यह

+0

आप इसे 'नई CExamDAO()' के बजाय इस तरह से क्यों कर रहे हो? यदि यह सच है कि "DataAccessLayer संदर्भ BusinessLayer में जोड़ा गया है" तो कोई कारण नहीं होना चाहिए कि आप 'नए' ऑपरेटर का उपयोग नहीं कर सकते हैं। या यदि आप वास्तव में सिर्फ एक प्रकार का संदर्भ चाहते हैं तो 'टाइपोफ (सीईएक्सएएमडीओ)' –

+0

हमें "कुंजी" का टेक्स्ट मान दें। – xanatos

+0

@ एडम राल्फ। वास्तव में मुझे कस्टम असेंबली और डिफ़ॉल्ट असेंबली के बीच स्विच करने की आवश्यकता है। मैं यहाँ उस कोड डाल दिया। –

उत्तर

3

यदि आप जानते हैं कि जो कुछ भी है, वह DataAccessLayer के भीतर होगा, तो मुझे जितना संभव हो सके Assembly संदर्भ मिलेगा, उदा।

Assembly assembly = typeof(AnyPublicTypeWithinTargetAssembly).Assembly; 
Type type = assembly.GetType(namespaceQualifiedTypeName); 

एक वैकल्पिक एक विधानसभा योग्य नाम के साथ Type.GetType उपयोग करने के लिए है, लेकिन यह अधिक घना प्रकार का नाम निर्दिष्ट करने के मामले में है।

+0

AnyPublicTypeWithinTargetAssembly क्या है, मुझे इस तक पहुंच नहीं मिल रही है। मुझे किस असेंबली संदर्भ का उपयोग करने की आवश्यकता है। –

+1

AnyPublicTypeWithinTargetAssembly लक्ष्य असेंबली के साथ कोई सार्वजनिक प्रकार है। बस उस असेंबली में एक प्रकार चुनें जिसे आप बाद में नहीं हटाएंगे, और अभिव्यक्ति में डाल देंगे। यदि आप असेंबली का नाम जानते हैं तो आप असेंबली का उपयोग कर सकते हैं। लोडफ्रॉम (असेंबलीनाम) – SWeko

0

तो CExamDAOExamDao का एक उपवर्ग है, तो संकेतन (ध्यान दें +) है:

Catalyst.DAL.ExamDAO+CExamDAO 

सबसे अच्छी बात आप कर सकते हैं सीधे एक CExamDAO बनाने और उसके बाद में अपने GetType().AssemblyQualifiedName (के लिए उदाहरण लेते है डिबगर)। की तरह कुछ:

(new CExamDAO()).GetType().AssemblyQualifiedName 

या (यदि आप जहां आपको उसकी आवश्यकता यकीन है अपने विधानसभा पहले से ही भरी हुई है)

(new CExamDAO()).GetType().FullName 

और फिर कॉपी/अपने कोड में चिपकाएं।

3

यदि कॉलिंग असेंबली में टाइप मौजूद नहीं है तो आपको टाइप उदाहरण प्राप्त करने के लिए AssemblyQualifiedName का उपयोग करने की आवश्यकता है। अपनी समस्या को हल करने के लिए, आपको namespace qualified name के बजाय AssemblyQualifiedName के साथ key मान सेट करने की आवश्यकता है।

+0

यह एक महत्वपूर्ण बिंदु है, चयनित उत्तर में उल्लिखित नहीं है: यदि निर्दिष्ट प्रकार कॉलिंग असेंबली से नहीं है, तो असेंबली योग्यता नाम होना आवश्यक है उपयोग किया गया। असेंबली नाम का उपयोग करने के लिए पर्याप्त नहीं है। – Schmuli

0

क्या आपका प्रकार सार्वजनिक है? आंतरिक वर्गों को विभिन्न असेंबली से लोड नहीं किया जा सकता है।

+0

हाँ, यह सार्वजनिक है –

0

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

private static object GetResultFromStaticMethodClass(string qualifiedClassName, string method) 
{ 
     Type StaticClass = Type.GetType(qualifiedClassName); 
     MethodInfo methodInfo = StaticClass.GetMethod(method); 
     object result = methodInfo.Invoke(null, null); 
     return result; 
} 

उपयोग:

object result = GetResultFromStaticMethodClass(
    "Utilities.StringHelper,DaProject", 
    "ToList" 
); 

यह स्थिर विधि ToListStringHelper कक्षा में नाम स्थान कहते हैं, उपयोगिताएँ में, DaProject में परियोजना (एक ही असेंबली और परियोजना का नाम)।

आप मानकों की जरूरत है, उन्हें दूसरा पैरामीटर में methodInfo.Invoke में (शून्य, नल) जोड़ने कॉल

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