6

我的代码是

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类型它不会

4

5 回答 5

3

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

于 2011-09-16T07:11:19.977 回答
2

如果您知道它将在 内是什么类型,那么我会尽可能简单地DataAccessLayer获得参考,例如Assembly

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

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

于 2011-09-16T06:38:52.557 回答
0

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

Catalyst.DAL.ExamDAO+CExamDAO

您可以做的最好的事情是直接创建一个 CExamDAO,然后获取它GetType().AssemblyQualifiedName(例如在调试器中)。就像是:

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

或(如果您确定在哪里需要它,它的程序集已经加载)

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

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

于 2011-09-16T07:10:51.573 回答
0

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

于 2011-09-16T07:12:30.650 回答
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项目(相同的程序集和项目名称)中的Utilities命名空间中的StringHelper类中的静态方法ToList 。

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

于 2013-04-11T06:45:14.533 回答