2011-09-16 22 views
6

mio codice èType.GetType (stringa typeName) restituisce null

type = Type.GetType(key); 

Key che mi passa è un namespace nome qualificato.

Il mio codice è in BusinessLayer. Sto creando un'istanza di DataAccessLayer. Il riferimento DataAccessLayer viene aggiunto a BusinessLayer.

sto ottenendo l'errore come "Impossibile caricare il tipo 'Catalyst.DAL.ExamDAO.CExamDAO' dal assembly 'BusinessLayer, Version = 1.9.3.0, Culture = neutral, PublicKeyToken = null'.".

Cosa devo fare per specificare esplicitamente che la classe proviene da DataAccessLayer?

Vale Key è "Catalyst.DAL.ExamDAO.CExamDAO"

Edit:

Il mio codice attuale è

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; 

     } 

Sto cercando di caricare le classi di default se non v'è nessuna personalizzazione Il metodo è in BO. Se passo la chiave come nomi qualificati dello spazio dei nomi di qualsiasi tipo di Bo che converte. Ma non digitare DAO

+0

Perché stai facendo in questo modo, invece di 'nuova CExamDAO()'? se è vero che "Riferimento DataAccessLayer viene aggiunto a BusinessLayer", non dovrebbe esserci motivo per cui non si possa usare l'operatore 'new'. O se si vuole solo un riferimento di tipo allora 'typeof (CExamDAO)' –

+0

Forniscici il valore di testo di "chiave". – xanatos

+0

@Adam Ralph. In realtà ho bisogno di passare da assembly personalizzati e assembly di default. Non ho messo il codice qui. –

risposta

3

Se si sa che qualunque sia il tipo sarà compreso tra DataAccessLayer, otterrei un riferimento Assembly nel modo più semplice possibile, ad es.

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

Un'alternativa è di usare Type.GetType con nome assemblaggio qualificato, ma che è più prolisso in termini di specificare il nome del tipo.

+0

qual è AnyPublicTypeWithinTargetAssembly, non riesco ad accedere a questo.Quale riferimento all'assembly devo utilizzare. –

+1

AnyPublicTypeWithinTargetAssembly è un tipo pubblico con assembly di destinazione. Scegli un tipo in quell'assieme che non rimuovi più tardi e inseriscilo nell'espressione. Inoltre, se si conosce il nome dell'assembly, è possibile utilizzare Assembly.LoadFrom (assemblyName) – SWeko

0

Se CExamDAO è una sottoclasse di ExamDao, quindi la notazione è (notare che il +):

Catalyst.DAL.ExamDAO+CExamDAO 

La cosa migliore che puoi fare è creare un CExamDAO direttamente e poi prendere il suo GetType().AssemblyQualifiedName (ad esempio nel debugger). Qualcosa di simile:

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

o (se siete sicuri dove serve il suo assemblaggio è già caricata)

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

e quindi copiare/incollare nel codice.

3

Se il tipo non è presente nell'assieme di chiamata, è necessario utilizzare AssemblyQualifiedName per ottenere l'istanza Tipo. Per risolvere il problema, è necessario impostare il valore key con AssemblyQualifiedName anziché namespace qualified name.

+0

Questo è un punto importante, non menzionato nella risposta selezionata: se il tipo specificato non proviene dall'assieme chiamante, il nome Qualificato dell'assembly deve essere Usato. Non è sufficiente usare solo il nome dell'assembly. – Schmuli

0

Il tuo tipo è pubblico? Le classi interne non possono essere caricate da diversi assiemi.

+0

sì, è pubblico –

0

Oppure provate questo:

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

Usa:

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

Questa chiamare il metodo statico ToList nel classe StringHelper, nelle Utilità namespace, nel DaProject Progetto (stesso assembly e nome del progetto).

Se avete bisogno di parametri, aggiungerli nel secondo parametro nella MethodInfo.Invoke (null, null) chiamata

Problemi correlati