2009-02-11 37 views
5

Tôi đang tìm một cách hiệu quả hơn để tìm một loại trong một hội mà xuất phát từ một loại cụ thể đã biết. Về cơ bản, tôi có một kiến ​​trúc plugin trong ứng dụng của tôi, và cho thời gian dài nhất, chúng tôi đã làm điều này:Làm cách nào tôi có thể định vị một loại cụ thể trong một Assembly * một cách hiệu quả *?

For Each t As Type In assem.GetTypes() 
    If t.BaseType Is pluginType Then 
     'Do Stuff here' 
    End If 
Next 

Một số plugin có một số lượng lớn các loại và chúng tôi đang bắt đầu thấy điều này mất một vài giây. Có cách nào tôi chỉ có thể yêu cầu tất cả các loại có BaseType của "pluginType"?

EDIT: Tôi đã đơn giản hóa mẫu mã của mình. Tôi đã sử dụng .GetExportedTypes() trong mã thực tế của tôi. Tuy nhiên, tôi rất nhiều lớp học được đánh dấu là Công khai, vì vậy nó không giúp quá nhiều. Tôi đã chải qua các dự án và đánh dấu tất cả mọi thứ "Bạn bè" ngoại trừ lớp plugin thực tế, và nó vẫn mất gần như cùng một khoảng thời gian để kiểm tra các hội đồng. Tôi cắt giảm 100 ms trong 1,3 giây (nhỏ hơn 10%). Đây có phải là thời gian tối thiểu tôi phải đối phó không? Tôi cũng đã thử đề nghị thuộc tính hội và nó vẫn không mang lại nhiều sự khác biệt (có thể 100ms một lần nữa). Là phần còn lại của thời gian tôi phải trả tiền để tải linh hoạt?

+0

Không thực sự là câu trả lời cho câu hỏi, nhưng có lẽ có một cái nhìn tại MEF: http: //www.codeplex.com/MEF – herskinduk

+0

Điều kiện thử nghiệm thực tế của bạn phức tạp hơn bao nhiêu? Bạn đang sử dụng 'AndAlso' và' OrElse' hay chỉ là 'And' và' Or'? Tôi hỏi vì trên máy chậm nhất của tôi, sử dụng trình thông dịch DotLisp, liệt kê 14807 loại mất 0.322 giây và nhận các loại công khai với 'BaseType = Component' mất 0,458 giây. Oh, khi kiểm tra phiên bản LinqPad đã biên dịch của truy vấn này trên máy chậm hơn này, tôi thấy vấn đề: trước khi các đối tượng 'Type' được lưu trữ, hoặc thậm chí được xây dựng đằng sau hậu trường, nó chậm hơn nhiều: 10961' Types' được liệt kê trong 10,206 giây! Ngay sau đó, chỉ có 0,03323 giây để tìm 'Thành phần'. –

Trả lời

1

Assembly.GetExportedTypes() chỉ trả về các lớp công khai. Điều này có thể giúp được không?

+0

Vui lòng xem câu hỏi được cập nhật ... –

4

Trước hết, bạn có thể thử sử dụng GetExportedTypes() để thu hẹp danh sách các loại tiềm năng. Ngoài ra, không có cách nào bạn có thể tăng tốc quá trình lặp lại. Bạn có thể, tuy nhiên, bao gồm một mainfest plugin mà sẽ xác định chính xác loại (các loại) của plugin trong một hội đồng đặc biệt:

<manifest> 
    <plugin type="FooBar.Plugins.BazPlugin, FooBar" /> 
</manifest> 

để bạn muốn có thể làm Type.GetType(string)

IPlugin plugin = (IPlugin)Type.GetType("manifest/plugin/@type" /* for the sake of this discussion */); 
+0

Vui lòng xem câu hỏi được cập nhật ... –

0

chúng tôi hệ thống trình cắm thêm sử dụng các thuộc tính để xác định các loại trình cắm thêm. Chúng tôi sau đó chỉ cần quét lắp ráp cho các thuộc tính cụ thể.

+0

Vui lòng xem câu hỏi được cập nhật ... –

1

Giải pháp từ mono-devel mailing list post by Jonathan PryorPlug-in Framework (Part1): Marking Types for Consumption: sử dụng thuộc tính mức lắp ráp.

Nói tóm lại, bạn muốn thêm một thuộc tính mới:

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple=true)] 
class PluginAttribute : Attribute { 
    public PluginAttribute (Type type) {this.Type = type;} 
    public Type Type {get; private set;} 
} 

Sau đó, xác định thuộc tính này ở mức độ lắp ráp:

[assembly:Plugin (typeof(Plugin1))] 
[assembly:Plugin (typeof(Plugin2))] 

Sau đó truy vấn lắp ráp cho tất cả các PluginAttributes:

Assembly a = ...; 
PluginAttribute[] plugins = 
    (PluginAttribute[]) a.GetCustomAttributes (
     typeof(PluginAttribute), true); 
foreach (var plugin in plugins) 
// plugin.Type is the type to use as a plugin 

Điều này có thể nhanh hơn đáng kể so với sử dụng Assembly.GetTypes()/Assembly.GetExportedTypes(), chỉ có các loại được liệt kê trong [assembly:Plugin] thuộc tính thực sự cần để được tải, có thể làm giảm đáng kể dung lượng bộ nhớ được tiêu thụ (tùy thuộc vào số lượng loại trong lắp ráp).

0

Đưa ra nhận xét của tôi về câu hỏi, nếu bạn có thể, liệt kê tất cả các loại trên một chuỗi khác trong khi thực hiện những việc khác. Sau đó, khi bạn đã sẵn sàng liệt kê các loại bạn cần, nó phải có ít nhất hai đơn đặt hàng của cường độ nhanh hơn, theo my tests.

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