2011-09-16 57 views
6

我的代碼是Type.GetType(字符串的typeName)返回null

type = Type.GetType(key); 

關鍵,我是通過一個命名空間限定名稱。

我的代碼在BusinessLayer中。我正在創建一個DataAccessLayer的實例。 DataAccessLayer引用被添加到BusinessLayer。

我收到錯誤的「未能從程序集加載類型「Catalyst.DAL.ExamDAO.CExamDAO‘BusinessLayer,版本= 1.9.3.0,文化=中立,公鑰=空’。」

我該怎麼做才能明確指出該類是從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; 

     } 

我想,如果有載入默認類沒有定製。方法在BO中。 如果我將密鑰作爲任何Bo類型的命名空間限定名稱傳遞,它將轉換。但是,它的DAO類型不會

+0

你爲什麼做這種方式,而不是'新CExamDAO()'?如果「DataAccessLayer引用被添加到BusinessLayer」是真的,那麼應該沒有理由不能使用'new'運算符。或者如果你真的想要一個類型引用,那麼'typeof(CExamDAO)' –

+0

給我們提供「key」的文本值。 – xanatos

+0

@Adam Ralph。其實我需要在自定義程序集和默認程序集之間切換。我把這個代碼放在這裏。 –

回答

3

如果您知道無論什麼類型,它將在DataAccessLayer之內,那麼我會盡可能簡單地獲得Assembly參考。

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

一種替代方案是使用Type.GetType集限定名稱,但這是更冗長中指定的類型名稱的條款。

+0

什麼是AnyPublicTypeWithinTargetAssembly,我無法訪問this.Which程序集引用我需要使用。 –

+1

AnyPublicTypeWithinTargetAssembly是任何帶有目標程序集的公共類型。只需在該程序集中選擇一種以後不會移除的類型,並將其放入表達式中即可。此外,如果您知道程序集的名稱,您可以使用Assembly.LoadFrom(assemblyName) – SWeko

0

如果CExamDAOExamDao一個子類,則記號(注意+):

Catalyst.DAL.ExamDAO+CExamDAO 

你能做的最好的事情是直接創建CExamDAO然後採取在其GetType().AssemblyQualifiedName(例如調試器)。喜歡的東西:

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

或者(如果你確信在你需要它的組件已經加載)

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

,然後複製/粘貼在你的代碼。

3

如果類型不存在於調用程序集中,則需要使用AssemblyQualifiedName來獲取它的Type實例。要解決您的問題,您需要設置keyAssemblyQualifiedName而不是namespace qualified name

+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" 
); 

這調用靜態方法ToList的StringHelper類,在公用事業命名空間,在DaProject項目(相同的裝配和項目名稱)。

如果您需要的參數,加上他們在第二個參數中methodInfo.Invoke(NULL,NULL)呼叫

相關問題