Type.GetType (string typeName) возвращает ноль - PullRequest
6 голосов
/ 16 сентября 2011

Мой код:

type = Type.GetType(key);

Ключ, который я передаю, является квалифицированным именем пространства имен.

Мой код в BusinessLayer.Я создаю экземпляр DataAccessLayer.Ссылка DataAccessLayer добавлена ​​в BusinessLayer.

Я получаю сообщение об ошибке как "Не удалось загрузить тип 'Catalyst.DAL.ExamDAO.CExamDAO' из сборки" BusinessLayer, версия = 1.9.3.0, Culture = нейтральный, PublicKeyToken = null '. ".

Что я должен сделать, чтобы явно указать, что класс является классом из 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, он конвертируется.Но DAO типа это не будет

Ответы [ 5 ]

3 голосов
/ 16 сентября 2011

Если тип отсутствует в вызывающей сборке, вам нужно использовать AssemblyQualifiedName, чтобы получить его Тип экземпляра.Чтобы решить вашу проблему, вам нужно установить key значение с AssemblyQualifiedName вместо namespace qualified name.

3 голосов
/ 16 сентября 2011

Если вы знаете, что любой тип будет в пределах DataAccessLayer, тогда я получу ссылку Assembly настолько просто, насколько это возможно, например,

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

В качестве альтернативы можно использовать Type.GetType с именем с указанием сборки, но это более скучно с точки зрения указания имени типа.

0 голосов
/ 11 апреля 2013

Или попробуйте это:

 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 , в пространстве имен Utilities , в проекте DaProject (та же сборка и название проекта).

Если вам нужны параметры, добавьте их во второй параметр в methodInfo.Invoke (null, null) call

0 голосов
/ 16 сентября 2011

Ваш тип публичный? Внутренние классы не могут быть загружены из разных сборок.

0 голосов
/ 16 сентября 2011

Если CExamDAO является подклассом ExamDao, то обозначение будет (обратите внимание на +):

Catalyst.DAL.ExamDAO+CExamDAO

Лучшее, что вы можете сделать, - это создать CExamDAO напрямую, а затем взять его GetType().AssemblyQualifiedName (например, в отладчике). Что-то вроде:

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

или (если вы уверены, что вам нужно, его сборка уже загружена)

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

, а затем скопируйте / вставьте его в свой код.

...