C# GetType(字符串typeName)返回null

C# GetType(字符串typeName)返回null,c#,class,reflection,activator,gettype,C#,Class,Reflection,Activator,Gettype,我的代码是 type = Type.GetType(key); 我传递的键是命名空间限定名 我的代码在BusinessLayer中。我正在创建DataAccessLayer的一个实例。 DataAccessLayer引用已添加到BusinessLayer 我收到的错误是:“无法从程序集‘BusinessLayer,Version=1.9.3.0,Culture=neutral,PublicKeyToken=null’加载类型‘Catalyst.DAL.ExamDAO.CExamDAO’。” 我

我的代码是

type = Type.GetType(key);
我传递的键是命名空间限定名

我的代码在BusinessLayer中。我正在创建DataAccessLayer的一个实例。 DataAccessLayer引用已添加到BusinessLayer

我收到的错误是:“无法从程序集‘BusinessLayer,Version=1.9.3.0,Culture=neutral,PublicKeyToken=null’加载类型‘Catalyst.DAL.ExamDAO.CExamDAO’。”

我应该做什么来明确指定该类来自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类型它不会

如果您知道它的类型将在
DataAccessLayer
中,那么我会得到一个
程序集
引用,尽可能简单,例如

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

另一种方法是使用程序集限定名称的
Type.GetType
,但在指定类型名称方面更冗长。

如果
CExamDAO
ExamDao
的子类,则表示法是(注意
+
):

最好的方法是直接创建CExamDAO,然后获取其
GetType().AssemblyQualifiedName
(例如在调试器中)。比如:

(new CExamDAO()).GetType().AssemblyQualifiedName
或者(如果您确定需要它的地方,它的程序集已经加载)


然后将其复制/粘贴到代码中。

如果调用程序集中不存在该类型,则需要使用
AssemblyQualifiedName
获取该类型实例。要解决此问题,您需要使用
AssemblyQualifiedName
而不是
命名空间限定名来设置

您的类型是公共的吗? 无法从不同程序集加载内部类。

或尝试以下操作:

 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;
 }
使用:

这将调用StringHelper类中Utilities命名空间中DaProject项目中的静态方法ToList(程序集和项目名称相同)


如果需要参数,请将它们添加到methodInfo.Invoke(null,null)调用中的第二个参数中

为什么这样做而不是
new CExamDAO()
?如果“DataAccessLayer引用已添加到BusinessLayer”是真的,那么您就没有理由不能使用
new
操作符。或者,如果您真的只需要一个类型引用,那么
typeof(CExamDAO)
为我们提供“key”的文本值。@Adam Ralph。实际上,我需要在自定义程序集和默认程序集之间切换。我无法将代码放在这里。@xan由于我将键值放在了目标程序集中的任何PublicTypeWithTargetAssembly的可能重复项上,所以我无法访问它。我需要使用哪个程序集引用。目标程序集中的任何PublicTypeWithTargetAssembly都是目标程序集中的任何public类型。只需在该程序集中选择一个稍后不会删除的类型,并将其放入表达式中。另外,如果您知道可以使用assembly.LoadFrom(assemblyName)的程序集名称,这是一个重要的问题,在所选答案中没有提到:如果指定的类型不是来自调用程序集,则需要使用程序集限定名。仅使用程序集名称是不够的。
(new CExamDAO()).GetType().FullName
 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"
);