Ich suche nach einer effizienteren Möglichkeit, einen Typ in einer Assembly zu finden, die von einem bekannten spezifischen Typ abgeleitet ist. Im Grunde habe ich eine Plugin-Architektur in meiner Anwendung, und für die längste Zeit, die wir haben das getan:Wie kann ich einen bestimmten Typ in einer Assembly * effizient finden *?
For Each t As Type In assem.GetTypes()
If t.BaseType Is pluginType Then
'Do Stuff here'
End If
Next
Einige der Plugins haben eine große Anzahl von Arten und wir beginnen, um zu sehen, das eine nehmen ein paar Sekunden. Gibt es eine Möglichkeit, nach allen Typen zu fragen, die einen BaseType von "pluginType" haben?
EDIT: Ich habe mein Codebeispiel zu stark vereinfacht. Ich habe .GetExportedTypes() in meinem tatsächlichen Code verwendet. Allerdings waren viele Klassen als "öffentlich" markiert, was nicht sehr hilfreich war. Ich habe die Projekte durchgekämmt und alles "Freund" markiert, mit Ausnahme der eigentlichen Plugin-Klasse, und es dauert immer noch fast die gleiche Zeit, um die Assemblys zu untersuchen. Ich schneide vielleicht 100 ms von 1,3 Sekunden (was weniger als 10% ist). Ist das nur die Mindestzeit, mit der ich mich auseinandersetzen muss? Ich habe auch den Assembly-Attribut-Vorschlag ausprobiert und es ergab immer noch keinen großen Unterschied (vielleicht wieder 100ms). Ist der Rest der Zeit der Overhead, den ich bezahlen muss, um Baugruppen dynamisch zu laden?
Nicht wirklich eine Antwort auf die Frage, aber vielleicht einen Blick auf MEF: http: //www.codeplex.com/MEF – herskinduk
Um wie viel komplexer ist Ihre reale Testbedingung? Verwenden Sie 'AndAlso' und' OrElse' oder nur 'And' und' Or'? Ich frage, weil auf meinem langsamsten Rechner mit dem DotLisp-Interpreter das Aufzählen von 14807-Typen 0,322 Sekunden dauert und das Abrufen von öffentlichen Typen mit "BaseType = Component" 0,458 Sekunden dauert. Oh, beim Überprüfen der kompilierten LinqPad-Version dieser Abfrage auf dieser langsameren Maschine sehe ich das Problem: Bevor die 'Type'-Objekte zwischengespeichert oder sogar hinter die Kulissen gebaut werden, ist es viel langsamer: 10961' Typen' in 10.206 Sekunden! Unmittelbar danach sind es nur noch 0,03323 Sekunden, um 'Components' zu finden. –