Тип.GetType (string typeName) возвращает значение null

мой код

type = Type.GetType(key);

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

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

Я получаю ошибку как " не удалось загрузить тип 'Catalyst.ДАЛМАТИНЕЦ.ExamDAO.CExamDAO от BusinessLayer сборку, версия=1.9.3.0, культура=нейтральных, PublicKeyToken=нуль'.".

что я должен сделать, чтобы указать явно, что класс из DataAccessLayer ?

ключевой Вале " катализатор.ДАЛМАТИНЕЦ.ExamDAO.CExamDAO"

Edit:

мой фактический код

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 . Но Дао типа это не

5 ответов


если вы знаете, что какой бы тип он ни был, он будет внутри DataAccessLayer, потом в Assembly ссылка как можно проще, например,

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

альтернативой является использование Type.GetType С сборка name, но это более длинное с точки зрения указания имени типа.


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


если CExamDAO - это подкласс ExamDao, затем нотация (Примечание +):

Catalyst.DAL.ExamDAO+CExamDAO

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

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

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

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

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


является ли ваш тип public? Внутренние классы нельзя загружать из разных сборок.


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

 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"
);

этот вызов статического метода в список на StringHelper класса в утилиты пространство имен, в DaProject project (то же имя сборки и проекта).

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