2011-09-16 7 views
6

Mój kod jestType.GetType (typeName ciąg znaków) zwraca null

type = Type.GetType(key); 

Key które mijam jest kwalifikowana nazwa przestrzeni nazw.

Mój kod znajduje się w BusinessLayer. Tworzę instancję DataAccessLayer. Informacje referencyjne DataAccessLayer są dodawane do BusinessLayer.

Otrzymuję błąd jako "Nie można załadować typu" Catalyst.DAL.ExamDAO.CExamDAO "z zespołu" BusinessLayer, wersja = 1.9.3.0, Culture = neutral, PublicKeyToken = null ".".

Co należy zrobić, aby wyraźnie określić, że klasa pochodzi z DataAccessLayer?

Key vale jest "Catalyst.DAL.ExamDAO.CExamDAO"

Edit:

Moje rzeczywisty kod jest

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; 

     } 

Próbuję załadować klas domyślnych, jeśli istnieje bez dostosowywania. Metoda znajduje się w BO. Jeśli przekazać klucz jako kwalifikowane nazwy przestrzeni nazw dowolnego typu Bo, to konwertuje. Ale typ DAO to nie będzie

+0

Dlaczego robisz to w ten sposób zamiast 'nowej CExamDAO()'? jeśli prawdą jest, że "odniesienie do DataAccessLayer zostało dodane do BusinessLayer", nie powinno być powodu, dla którego nie możesz użyć operatora 'new'. Lub jeśli naprawdę chcesz tylko odwołanie do typu, to 'typeof (CExamDAO)' –

+0

Podaj nam wartość tekstową "klucza". – xanatos

+0

@Adam Ralph. W rzeczywistości muszę przełączać się pomiędzy niestandardowymi złożeniami i domyślnym zestawem. Nie wstawiłem tego kodu tutaj. –

Odpowiedz

3

Jeśli wiesz, że niezależnie od tego, jaki będzie on w zakresie DataAccessLayer, otrzymam referencję Assembly tak prosto, jak to tylko możliwe, np.

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

Alternatywą jest użycie Type.GetType z zespół wykwalifikowanych nazwy, ale to bardziej rozwlekły w zakresie określania nazwy typu.

+0

co to jest AnyPublicTypeWithinTargetAssembly, nie otrzymuję dostępu do tego. Którego odniesienia do zestawu muszę użyć. –

+1

AnyPublicTypeWithinTargetAssembly jest dowolnym publicznym typem zespołu docelowego. Po prostu wybierz jeden typ tego zestawu, którego nie usuniesz później, i umieść go w wyrażeniu. Również jeśli znasz nazwę zestawu, możesz użyć Assembly.LoadFrom (assemblyName) – SWeko

0

Jeśli CExamDAO jest podklasą ExamDao, wówczas zapis jest (należy zwrócić uwagę na +):

Catalyst.DAL.ExamDAO+CExamDAO 

Najlepszą rzeczą, jaką możesz zrobić, to stworzyć CExamDAO bezpośrednio, a następnie podejmuje GetType().AssemblyQualifiedName (na przykład w debugger). Coś jak:

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

lub (jeśli jesteś pewien, gdzie jest to potrzebne jego zespół jest już załadowany)

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

i skopiuj/wklej go w kodzie.

3

Jeśli typ nie występuje w zestawie wywołującym, należy użyć parametru AssemblyQualifiedName, aby pobrać instancję typu. Aby rozwiązać problem, musisz ustawić wartość key na wartość AssemblyQualifiedName zamiast namespace qualified name.

+0

Jest to ważny punkt, nie wspomniany w zaznaczonej odpowiedzi: jeśli określony typ nie pochodzi od wywołującego zestawu, nazwa kwalifikowanego zestawu musi być używany. Nie wystarczy po prostu użyć nazwy zespołu. – Schmuli

0

Czy Twój typ jest publiczny? Klasy wewnętrzne nie mogą być ładowane z różnych złożeń.

+0

tak, jest publiczne –

0

Lub spróbuj tego:

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

Zastosowanie:

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

to nazwać metodą statyczną ToList w StringHelper klasie, w Utilities nazw w DaProject projekt (ten sam zbiór i nazwa projektu).

Jeśli potrzebujesz parametrów, dodać je do drugiego parametru w methodInfo.Invoke (null, null) wezwanie

Powiązane problemy