Тип.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
а затем скопируйте / вставьте его в свой код.
или попробуйте этот:
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) вызов