Type.GetType(string typeName)返回null

时间:2011-09-16 06:36:14

标签: 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'。”

如何明确指定该类来自DataAccessLayer?

Key vale是“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类型它不会

5 个答案:

答案 0 :(得分:3)

如果您知道它的任何类型都在DataAccessLayer范围内,那么我会尽可能简单地获得Assembly引用,例如

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

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

答案 1 :(得分:3)

如果调用程序集中不存在该类型,则需要使用AssemblyQualifiedName来获取Type实例。要解决您的问题,您需要使用key而不是AssemblyQualifiedName设置namespace qualified name值。

答案 2 :(得分:0)

如果CExamDAOExamDao的子类,那么表示法是(注意+):

Catalyst.DAL.ExamDAO+CExamDAO

您可以做的最好的事情是直接创建CExamDAO,然后使用GetType().AssemblyQualifiedName(例如在调试器中)。类似的东西:

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

或(如果你确定你需要的地方,它的装配已经加载了)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分: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"
);

实用程序类中,在实用程序命名空间中,在 DaProject 中调用 StringHelper 类中的静态方法 ToList 项目(相同的程序集和项目名称)。

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