2011-09-16 35 views
6

Mã của tôi làType.GetType (string typeName) trả về null

type = Type.GetType(key); 

chính mà tôi vượt qua là một cái tên có trình độ namespace.

Mã của tôi nằm trong BusinessLayer. Tôi đang tạo một thể hiện của DataAccessLayer. Tham chiếu DataAccessLayer được thêm vào BusinessLayer.

Tôi nhận được lỗi là "Không thể tải loại 'Catalyst.DAL.ExamDAO.CExamDAO' từ assembly 'BusinessLayer, Version = 1.9.3.0, Culture = neutral, PublicKeyToken = null'.".

Tôi nên làm gì để chỉ định rõ ràng rằng lớp đó là từ DataAccessLayer?

thung lũng chính là "Catalyst.DAL.ExamDAO.CExamDAO"

Edit:

mã thực tế của tôi là

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; 

     } 

Tôi cố gắng để tải các lớp mặc định nếu có không có tùy chỉnh. Phương thức là trong BO. Nếu tôi chuyển khóa như tên không gian tên đủ điều kiện của bất kỳ loại Bo nào nó chuyển đổi. Nhưng DAO gõ nó wont

+0

Tại sao các bạn làm theo cách này thay vì 'CExamDAO mới()'? nếu đúng là "tham chiếu DataAccessLayer được thêm vào BusinessLayer" thì không có lý do gì mà bạn không thể sử dụng toán tử 'new'. Hoặc nếu bạn thực sự chỉ muốn tham chiếu kiểu thì 'typeof (CExamDAO)' –

+0

Cho chúng tôi giá trị văn bản của "khóa". – xanatos

+0

@Adam Ralph. Trên thực tế tôi cần phải chuyển đổi giữa các hội đồng tùy chỉnh và lắp ráp mặc định. Tôi dint đặt mã đó ở đây. –

Trả lời

3

Nếu bạn biết rằng bất kỳ loại nào sẽ nằm trong phạm vi DataAccessLayer, thì tôi sẽ nhận được tham chiếu Assembly đơn giản nhất có thể, ví dụ:

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

Một cách khác là sử dụng Type.GetType với một tên lắp ráp đủ điều kiện, nhưng đó là dài dòng hơn về cách xác định tên kiểu.

+0

AnyPublicTypeWithinTargetAssembly là gì, tôi không nhận được quyền truy cập vào tài liệu này. Tôi cần sử dụng tham chiếu lắp ráp nào. –

+1

AnyPublicTypeWithinTargetAssembly là bất kỳ loại công khai nào với mục tiêu lắp ráp. Chỉ cần chọn một loại trong hội đồng mà bạn sẽ không loại bỏ sau này, và đặt nó trong biểu thức. Ngoài ra nếu bạn biết tên của hội đồng bạn có thể sử dụng Assembly.LoadFrom (assemblyName) – SWeko

0

Nếu CExamDAO là một lớp con của ExamDao, sau đó các ký hiệu được (chú ý +):

Catalyst.DAL.ExamDAO+CExamDAO 

Điều tốt nhất bạn có thể làm là tạo ra một CExamDAO trực tiếp và sau đó đi GetType().AssemblyQualifiedName (ví dụ của nó trong trình gỡ rối). Một cái gì đó như:

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

hoặc (nếu bạn chắc chắn nơi bạn cần lắp ráp của nó đã được nạp)

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

và sau đó copy/paste nó trong mã của bạn.

3

Nếu loại không có trong hội đồng gọi điện thoại, bạn cần sử dụng AssemblyQualifiedName để có được loại Ví dụ. Để giải quyết vấn đề của bạn, bạn cần đặt giá trị key với AssemblyQualifiedName thay vì namespace qualified name.

+0

Đây là một điểm quan trọng, không được đề cập trong câu trả lời được chọn: nếu loại được chỉ định không phải là từ hội đồng gọi, tên hội đủ điều kiện cần phải được đã sử dụng. Nó không đủ để chỉ sử dụng tên lắp ráp. – Schmuli

0

Loại của bạn có công khai không? Các lớp bên trong không thể nạp được từ các assembly khác nhau.

+0

có, nó là công khai –

0

Hoặc thử này:

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

Sử dụng:

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

này gọi phương thức tĩnh ToList trong lớp StringHelper, trong Utilities namespace, trong DaProject dự án (cùng một tên lắp ráp và dự án).

Nếu bạn cần các thông số, thêm chúng vào tham số thứ hai trong methodInfo.Invoke (null, null) gọi