2011-09-11 36 views
5

Tôi đang cố gắng định vị một kiểu khi chạy từ một danh sách các assembly; mã của tôi là một cái gì đó như thế này:Tại sao Type.GetType() làm việc và Assembly.GetType() không hoạt động?

foreach (Assembly assembly in assembliesToSearch) 
{ 
    Type t = assembly.GetType(assemblyName); 
    if (t != null) 
    { 
     return t; 
    } 
} 

, và vấn đề mà tôi có là t luôn luôn là null. Chơi đùa với các trình gỡ lỗi và cửa sổ Intermediate trong VS2010, tôi nhận thấy sau khi tôi đặt một breakpoint bên trong vòng lặp:

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

hoạt động OK, nhưng

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

không (khi lắp ráp là lắp ráp mà tôi biết có chứa các lớp học tôi đang tìm kiếm - trong trình gỡ lỗi, tôi có thể đặt một chiếc đồng hồ trên assembly.GetTypes(), duyệt đến lớp tôi đang cố gắng để nhanh chóng, và gọi assembly.GetType ("MyNamespace.MyClass , MyNamespace ")).

Có ai biết tại sao tìm kiếm tất cả các assembly bằng cách sử dụng Type.GetType() hoạt động, nhưng tìm kiếm assembly mà tôi biết có chứa kiểu assembly.GetType() không?

Trả lời

9

Từ các tài liệu MSDN cho hai phương pháp, Type.GetType() hy vọng một cái tên lắp ráp đủ tiêu chuẩn của một loại trong khi Assembly.GetType() hy vọng tên đầy đủ các loại. Đây không phải là điều tương tự.

typeof(MyNamespace.MyClass).AssemblyQualifiedName kết quả là một tên lắp ráp đủ tiêu chuẩn của một loại (cái gì đó như MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral), vì vậy nó không làm việc với các Assembly.GetType() gọi được mong đợi một chuỗi theo định dạng MyNamespace.MyClass.

Điều này có thể là do bạn chuyển tên hội đủ điều kiện đến cuộc gọi Assembly.GetType(), nó đang tìm kiếm một loại trong assembly có tên đầy đủ khớp với những gì bạn đã cung cấp. Nó không thể tìm thấy một, vì vậy bạn nhận được một null trả lại. Đây không phải là trường hợp với các cuộc gọi Type.GetType() vì nó mong đợi để có được một tên hội đủ điều kiện của một loại và có thể xác định vị trí cả lắp ráp và loại.


Something cần lưu ý:

Nếu bạn đang "cố gắng xác định vị trí một loại tại thời gian chạy từ một danh sách các cụm" như bạn nói, bạn có lẽ tốt hơn bằng cách sử dụng Assembly.GetType() cuộc gọi trên từng lắp ráp trong danh sách và chuyển vào tên đầy đủ của loại. Type.GetType() rất có thể sẽ được sử dụng các tài liệu tham khảo của hiện đang lắp ráp để giải quyết các loại, vì vậy nếu loại tồn tại trong một hội đồng đó không phải là một tài liệu tham khảo, nó sẽ không được tìm thấy.

+0

Cảm ơn bạn đã phản hồi; mẫu mã ban đầu của tôi không hiển thị rõ ràng, nhưng bên trong vòng lặp của tôi, nơi tôi đang gọi Type t = assembly.GetType (assemblyName), assemblyName là "MyNamespace.MyClass, MyAssembly", do đó, theo tính toán của tôi, nó phải được trả lại Loại mong đợi. –

+0

@David: 'MyNamespace.MyClass, MyAssembly' vẫn là tên loại đủ điều kiện lắp ráp. Bạn cần phải bỏ tên assembly từ chuỗi đó để nó hoạt động với 'Assembly.GetType()'. – adrianbanks

+0

@adrianbanks - nơi bạn đã học "Type.GetType() rất có thể sẽ sử dụng các tham chiếu của assembly hiện tại để giải quyết kiểu" - nó dường như không nằm trong [MSDN here] (http: // msdn .microsoft.com/vi-us/library/w3f99sx1 (v = vs.110) .aspx). Ngoài ra, "hội đồng hiện tại" là gì? Trong trường hợp tôi đang xem xét, lắp ráp với loại - được tìm thấy! - không phải là lắp ráp với phương pháp hiện đang được thực hiện và không phải là một tham chiếu của nó ... nhưng nó _is_ một hội đồng trên ngăn xếp cuộc gọi.(Lý do cho câu hỏi của tôi: Phiên bản trong tên lắp ráp của tôi là sai nhưng loại được tìm thấy.) – davidbak

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