2012-08-16 38 views
9

Đây là những câu hỏi tương tự: How-to: Load a type from a referenced assembly at runtime using a string in Silverlight, GetType on a class in a referenced assembly fails nhưng không có câu trả lời nào hoạt động.Nhận loại trong hội đồng tham chiếu bằng cách cung cấp tên lớp dưới dạng chuỗi?

Tôi đã có dự án MVC để lấy dữ liệu từ cơ sở dữ liệu bao gồm các loại đơn giản dưới dạng chuỗi. Các kiểu này nằm trong một assembly được tham chiếu, chứ không phải trong dự án MVC.

Vì vậy, ví dụ giả sử Khảo Tên hội của tôi là MyFramework và loại tên đồng bằng Car, tên loại đầy đủ có thể là MyFramework.Cars.Car hoặc MyFramework.Vehicles.Cars.Car hoặc một số biến thể khác. Tất cả những gì tôi có là tên assembly được tham chiếu và tên lớp đơn giản là các chuỗi. Làm thế nào tôi có thể nhận được loại bất kể tên loại đầy đủ?

Cuối cùng, tôi có thể viết một hàm trong assembly được tham chiếu gọi GetType() và sử dụng nó trong dự án MvC để tôi có thể bỏ qua bao gồm tên assembly? Tôi muốn loại bỏ biết tên lắp ráp vì vậy tôi nghĩ tôi có thể viết một util TRÊN lắp ráp tham chiếu như:

namespace MyFramework //the referenced assembly 
{ 
    public static class TypeUtil 
    { 
    public static Type GetFrameworkType(string typeName) 
    { 
     return Type.GetType(typeName); 
    } 
    } 
} 

Và rồi trong dự án MVC của tôi, tôi có thể gọi nó mà không cần lắp ráp như một tên chuỗi. Có phải là có thể hoặc tôi sẽ luôn luôn cần tên lắp ráp?

+0

Tại sao các câu trả lời khác không hoạt động? –

+0

@RobertHarvey Đó là vì tôi chỉ có tên lớp đơn giản. Không phải tên đầy đủ. Những câu trả lời đó dựa vào việc biết loại đầy đủ. – SventoryMang

Trả lời

19

Có lẽ hội đồng tham chiếu không được tải vào thời điểm đó. Ngoài ra, tôi hiểu từ câu hỏi của bạn rằng bạn không có tên loại đầy đủ, chỉ có tên lớp.
Bạn nên thử một cái gì đó dọc theo dòng này thì:

Type type = Assembly.Load("YourAssemblyName").GetTypes().First(t => t.Name == "ShortTypeName"); 

Hope tôi hiểu bạn một cách chính xác.

+0

Nếu tôi viết Util trong hội đồng đó nhưng vẫn chỉ có tên lớp, nó sẽ trông như thế nào? Tôi muốn loại bỏ sự cần thiết cho tên assembly bằng cách viết một lớp 'TypeUtil' có thể có một hàm' GetTypeFromFramework (string typeName) '. Tôi nghĩ nếu tôi gọi 'GetType' trong hội đồng đó, tôi không cần phải sử dụng assembly, nhưng nó vẫn trả về null. – SventoryMang

+0

Vui lòng gửi mẫu của những gì bạn đang cố gắng làm, để chúng tôi có thể hiểu rõ hơn về tình huống của bạn. –

+0

Tôi đã chỉnh sửa câu hỏi. Câu trả lời của bạn hoạt động khi sử dụng nó trong Util của tôi. Tôi chỉ tò mò nếu tôi có thể loại bỏ sự phụ thuộc vào tên lắp ráp như một chuỗi. Tôi đã ấn tượng rằng nếu tôi gọi GetType() trong hội đồng đó, tôi sẽ không cần phải cung cấp tên assembly, nhưng chỉ đơn giản là cung cấp 'Type.GetType (tên lớp)' giữ trả về null, ngay cả khi mã này nằm trong tham chiếu hội đồng. – SventoryMang

9

Đối với câu hỏi đầu tiên, bạn có thể làm một cái gì đó giống như

Type t = AppDomain.CurrentDomain.GetAssemblies() 
           .Where(a => a.FullName == "MyFramework") 
           .SelectMany(a => a.GetTypes()) 
           .Where(t => t.Name == "Car") 
           .FirstOrDefault(); 

Tôi không chắc chắn những gì bạn có ý nghĩa bởi câu hỏi thứ hai.

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