2011-09-16 20 views
6

Mi código esType.GetType (typeName cadena) devuelve un valor nulo

type = Type.GetType(key); 

llave que me pase es un nombre calificado de espacio de nombres.

Mi código está en BusinessLayer. Estoy creando una instancia de DataAccessLayer. La referencia de DataAccessLayer se agrega a BusinessLayer.

Recibo el error como "No se pudo cargar el tipo 'Catalyst.DAL.ExamDAO.CExamDAO' del ensamblado 'BusinessLayer, Version = 1.9.3.0, Culture = neutral, PublicKeyToken = null'.".

¿Qué debo hacer para especificar explícitamente que la clase es de DataAccessLayer?

Vale clave es "Catalyst.DAL.ExamDAO.CExamDAO"

Editar:

Mi código actual es

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; 

     } 

Estoy tratando de cargar las clases por defecto si hay sin personalización. El método está en BO. Si paso la clave como nombres calificados del espacio de nombre de cualquier tipo de Bo, se convierte. Pero tipo DAO

+0

¿Por qué haces de esta manera en lugar de 'nueva CExamDAO()'? si es cierto que "la referencia de DataAccessLayer se agrega a BusinessLayer", entonces no debería haber ninguna razón para que no pueda usar el operador 'new'. O si realmente solo quiere un tipo de referencia, entonces 'typeof (CExamDAO)' –

+0

Danos el valor de texto de "clave". – xanatos

+0

@ Adam Ralph. En realidad, necesito cambiar entre ensambles personalizados y ensamblaje predeterminado. Yo no puse ese código aquí. –

Respuesta

3

Si sabe que sea del tipo que sea, estará dentro de DataAccessLayer, entonces obtendría una referencia Assembly lo más simple posible, p. Ej.

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

Una alternativa es utilizar Type.GetType con un nombre montaje cualificado, pero eso es más largo aliento en términos de especificar el nombre de tipo.

+0

¿Qué es AnyPublicTypeWithinTargetAssembly? No estoy obteniendo acceso a esto. Lo cual necesito para usar la referencia de ensamblado. –

+1

AnyPublicTypeWithinTargetAssembly es cualquier tipo público con el conjunto de destino. Simplemente elija un tipo en ese ensamblaje que no eliminará más adelante, y póngalo en la expresión. Además, si conoce el nombre del ensamblaje, puede usar Assembly.LoadFrom (assemblyName) – SWeko

0

Si CExamDAO es una subclase de ExamDao, a continuación, la notación es (tenga en cuenta la +):

Catalyst.DAL.ExamDAO+CExamDAO 

Lo mejor que puede hacer es crear un CExamDAO directamente y luego tomar su GetType().AssemblyQualifiedName (por ejemplo en el depurador). Algo así como:

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

o (si está seguro de donde lo necesite su montaje ya está cargado)

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

y luego copiar/pegar en su código.

3

Si el tipo no está presente en el ensamblaje de llamadas, necesita usar el AssemblyQualifiedName para obtenerlo. Para resolver su problema, necesita establecer el valor key con AssemblyQualifiedName en lugar de namespace qualified name.

+0

Este es un punto importante, no mencionado en la respuesta seleccionada: si el tipo especificado no es del ensamblado que realiza la llamada, el nombre calificado de ensamblado debe ser usado. No basta con usar el nombre del ensamblado. – Schmuli

0

¿Es su tipo público? Las clases internas no se pueden cargar desde diferentes ensamblajes.

+0

sí, es público –

0

O intente esto:

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; 
} 

Uso:

object result = GetResultFromStaticMethodClass(
    "Utilities.StringHelper,DaProject", 
    "ToList" 
); 

esta llamada al método estático ToList en el clase StringHelper, en los Utilidades espacio de nombres, en el DaProject Proyecto (el mismo nombre de ensamblado y proyecto).

Si necesita parámetros, añadirlos en el segundo parámetro en el MethodInfo.Invoke (null, null) llamada

Cuestiones relacionadas