Type.GetType(string typeName) returns null
My code is
type = Type.GetType(key);
Key which i pass is a namespace qualified name .
My code is in BusinessLayer. I am creating a instance of DataAccessLayer. DataAccessLayer reference is added to BusinessLayer.
I am getting the error as "Could not load type 'Catalyst.DAL.ExamDAO.CExamDAO' from assembly 'BusinessLayer, Version=1.9.3.0, Culture=neutral, PublicKeyToken=null'.".
What should i do to specify explicitly thats the class is from DataAccessLayer ?
Key vale is "Catalyst.DAL.ExamDAO.CExamDAO"
Edit :
My actual code is
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;
}
I am trying to load the default classes if there is no customization . Method is in BO . If i pass the key as namespace qualified names of any Bo type it converts . But DAO type it wont
If you know that whatever type it is will be within DataAccessLayer
, then I'd get an Assembly
reference as simply as possible, e.g.
Assembly assembly = typeof(AnyPublicTypeWithinTargetAssembly).Assembly;
Type type = assembly.GetType(namespaceQualifiedTypeName);
An alternative is to use Type.GetType
with an assembly-qualified name, but that's more long-winded in terms of specifying the type name.
If the type is not present in calling assembly you need to use the AssemblyQualifiedName
to get it Type instance. To resolve your issue, you need set key
value with AssemblyQualifiedName
instead of namespace qualified name
.
If CExamDAO
is a subclass of ExamDao
, then the notation is (note the +
):
Catalyst.DAL.ExamDAO+CExamDAO
The best thing you can do is create a CExamDAO directly and then take its GetType().AssemblyQualifiedName
(for example in the debugger). Something like:
(new CExamDAO()).GetType().AssemblyQualifiedName
or (if you are sure where you need it its assembly is already loaded)
(new CExamDAO()).GetType().FullName
and then copy/paste it in your code.
Is your type public? Internal classes can not be loaded from different assemblies.
Or try this:
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;
}
Use:
object result = GetResultFromStaticMethodClass(
"Utilities.StringHelper,DaProject",
"ToList"
);
This call the static method ToList in the StringHelper class, in the Utilities namespace, in the DaProject project (same assembly and project name).
If you need parameters, add them in the second parameter in the methodInfo.Invoke(null, null) call
精彩评论