Kuntady Nithesh
Kuntady Nithesh

Reputation: 11731

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

Upvotes: 6

Views: 13045

Answers (5)

Rowinson Gallego
Rowinson Gallego

Reputation: 856

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

Upvotes: 0

user900202
user900202

Reputation:

Is your type public? Internal classes can not be loaded from different assemblies.

Upvotes: 0

Bharath
Bharath

Reputation: 807

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.

Upvotes: 3

xanatos
xanatos

Reputation: 111950

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.

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1504182

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.

Upvotes: 4

Related Questions