2009-02-11 16 views
5

Szukam bardziej efektywnego sposobu na znalezienie typu w zespole, który wywodzi się ze znanego określonego typu. Zasadniczo mam architekturę wtyczek w mojej aplikacji, a najdłużej robiliśmy to:Jak skutecznie zlokalizować określony typ w zespole *?

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

Niektóre z wtyczek mają dużą liczbę typów i zaczynamy widzieć to potrwać kilka sekund. Czy jest jakiś sposób mogę poprosić o wszystkie typy, które mają BaseType "pluginType"?

EDYTOWANIE: I over-uproszczony mój próbkę kodu. Używałem .GetExportedTypes() w moim rzeczywisty kod. Jednak wiele zajęć zostało oznaczonych jako publiczne, więc nie pomagało to zbytnio. Przejrzałem projekty i zaznaczyłem wszystko "Przyjaciel", z wyjątkiem rzeczywistej klasy wtyczek, i nadal zajmuje to prawie tyle samo czasu, aby sprawdzić złożenia. Zerowałem może 100 ms z 1,3 sekundy (czyli mniej niż 10%). Czy to tylko minimalny czas, z którym muszę sobie poradzić? Próbowałem też sugestii Assembly Attribute i nadal nie dawało to wielkiej różnicy (może znowu 100ms). Czy reszta czasu to obciążenie, które muszę płacić, aby ładować zespoły dynamicznie?

+0

Naprawdę nie jest to odpowiedź na pytanie, ale być może warto rzucić okiem na MEF: http: //www.codeplex.com/MEF – herskinduk

+0

O ile bardziej skomplikowany jest twój prawdziwy warunek testowy? Czy używasz 'AndAlso' i' OrElse' lub po prostu 'And' i' Or'? Pytam, ponieważ na mojej najwolniejszej maszynie, użycie interpretera DotLisp, wyliczenie 14807 typów zajmuje 0,322 sekundy, a uzyskanie typów publicznych z 'BaseType = Component' trwa 0,458 sekund. Och, sprawdzając skompilowaną wersję LinqPada tego zapytania na tym wolniejszym komputerze widzę problem: zanim obiekty 'Type' zostaną zbuforowane, lub nawet zbudowane za kulisami, jest to znacznie wolniejsze: 10961" Typów "wyliczonych w 10,206 sekundach! Natychmiast po znalezieniu "Komponentów" wystarczy tylko 0,03323 sekundy. –

Odpowiedz

1

Assembly.GetExportedTypes() zwraca jedynie klasy publiczne. Czy to może pomóc?

+0

Proszę zobaczyć zaktualizowane pytanie ... –

4

Po pierwsze, możesz spróbować użyć GetExportedTypes(), aby zawęzić listę potencjalnych typów. Poza tym nie ma możliwości przyspieszenia procesu iteracji. Można jednak zawierać mainfest wtyczek, które określić dokładny typ (typy) wtyczek w szczególności montaż:

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

tak, że byłbyś w stanie zrobić Type.GetType(string)

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

Proszę zobaczyć zaktualizowane pytanie ... –

0

Our System wtyczek wykorzystuje atrybuty do identyfikowania typów wtyczek. Następnie skanujemy złożenie pod kątem określonego atrybutu.

+0

Proszę zobaczyć zaktualizowane pytanie ... –

1

Rozwiązanie z mono-devel mailing list post by Jonathan Pryor i Plug-in Framework (Part1): Marking Types for Consumption: używa atrybutów poziomu zespołu.

W skrócie, by dodać nowy atrybut:

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

następnie określić ten atrybut na poziomie Montaż:

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

następnie kwerendę zespół dla wszystkich 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 

Może to być znacznie szybsze niż użycie Assembly.GetTypes()/Assembly.GetExportedTypes(), jako tylko , typy, które są wymienione w atrybutach [assembly:Plugin], rzeczywiście wymagają załadowania , co może znacznie zmniejszyć zużywaną ilość pamięci (w zależności od liczby typów w zespole).

0

Biorąc pod uwagę mój komentarz na temat tego pytania, jeśli potrafisz, wyliczyć wszystkie typy w innym wątku podczas wykonywania innych czynności. Następnie, gdy będziesz gotowy do wyliczenia potrzebnych typów, powinien on być o co najmniej dwa rzędy wielkości szybszy, zgodnie z my tests.