2011-09-16 56 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)呼叫

相关问题