2012-10-15 21 views
6

Tôi chỉ nhận thấy một lỗi trong các chức năng:Type.GetType không làm việc loại

Type.GetType("System.Uri"); 

Giá trị trả về là null trong khi các chức năng sau đang hoạt động khá tốt ...

Type.GetType("System.string"); 
Type.GetType("System.bool"); 
Type.GetType("System.DateTime"); 

. ..

Bất cứ ai cũng biết, tại sao Loại được trả lại là rỗng?

EDIT: loại bỏ Uri kép ...

+12

bối rối: bạn hiển thị System.Uri trong cả hai làm việc và không làm việc – BugFinder

+2

Tôi rất ngạc nhiên rằng 'Type.GetType ("System.String");' và 'Type.GetType (" System.bool ");" đang hoạt động vì tôi không biết về sự tồn tại của các loại đó. –

+0

Darin, chuỗi và bool là shorcuts để loại trong không gian tên hệ thống. http://msdn.microsoft.com/es-es/library/system.string(v=vs.80).aspx – Oscar

Trả lời

15

Lý do mà Type.GetType("System.Uri") lợi nhuận null là loại đó nằm ở system.dll thay vì mscorlib.dll. Bạn phải sử dụng tên hội đủ điều kiện như đã nêu ở trên.

Từ MSDN:

typeName Loại: System.String

Tên lắp ráp đủ của các loại để có được. Xem AssemblyQualifiedName. Nếu loại trong hội đồng hiện đang thực hiện hoặc trong Mscorlib.dll, nó là đủ để cung cấp tên loại đủ điều kiện bằng không gian tên của nó.

+0

Đó là giải pháp, cảm ơn! – Daffi

1

Type.GetType(String):

Gets Type với tên được chỉ định, thực hiện tìm kiếm case-sensitive.

Return Value

Loại: System.Type

Kiểu với tên được chỉ định, nếu tìm thấy; nếu không, null.

Vì vậy, nếu bạn mắc lỗi đánh máy, loại của bạn sẽ không được tìm thấy và null sẽ được trả lại. Đây không phải là một lỗi.

1

Không có thông tin bổ sung, tôi đoán bạn không sử dụng tên loại đủ điều kiện. Type.GetType() không chỉ mong đợi tên loại đủ điều kiện (ví dụ: System.String), mà còn là assembly-qualified name, trong trường hợp bạn đang cố tải bất kỳ thứ gì khác ngoài loại lắp ráp hiện đang thực thi.

+1

Tôi nghi ngờ điều này là nó. Nếu bạn nhấn 'Type.GetType (" System.Uri ")' nó sẽ trả về null. Nhưng nếu bạn sử dụng 'Type.GetType (" System.Uri, System ")' nó hoạt động tốt. (ít nhất là trong LinqPad) –

3

thử mã này:

Uri uri = new Uri("http://test"); 
Type t = Type.GetType(uri.GetType().AssemblyQualifiedName); 

và sau đó u có thể sao chép/dán AssemblyQualifiedName từ loại

phương pháp khác sẽ là:

Type t = typeof(Uri); 
10

Tôi cũng nhấn vấn đề này và nhận ra rằng, đặc biệt là trong ASP.Net với biên dịch JIT, tôi không phải lúc nào cũng biết thông tin Assembly. Tôi đã thêm phần sau vào lớp ReflectionUtilities của mình.Nó là một "sledgehammer để crack một nut" ở một mức độ nào đó nhưng nó hoạt động với cả AssemblyQualifiedName và lớp cơ bản FullName. Việc đầu tiên về cơ bản ngắn mạch tìm kiếm các CurrentDomainAssemblies mà phải xảy ra khác.

public static Type FindType(string qualifiedTypeName) 
    { 
     Type t = Type.GetType(qualifiedTypeName); 

     if (t != null) 
     { 
      return t; 
     } 
     else 
     { 
      foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) 
      { 
       t = asm.GetType(qualifiedTypeName); 
       if (t != null) 
        return t; 
      } 
      return null; 
     } 
    } 

Lưu ý: Đưa ra các vấn đề về hiệu suất Phản chiếu không nên được gọi bên trong vòng mà không có trình độ lắp ráp nếu có thể. Tốt hơn để truy cập vào mục đầu tiên bạn cần, trích xuất thông tin lắp ráp từ đó và tiến hành từ đó. Không phải lúc nào cũng phù hợp nhưng hiệu quả hơn nhiều (nếu bất cứ điều gì trong Reflection có thể được gọi là hiệu quả :-)).

Alistair

+0

Wow, đây là một chức năng thực sự hữu ích, một trong những viên đá quý vàng được giấu đi! – Radderz

Các vấn đề liên quan