2010-02-07 5 views
5

Ho un qualcosa di un'interfaccia marcatore di simile:C'è un/modo più rapido migliore per ottenere metodi che hanno attributo applicato in C#

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)] 
public class MyAttribute : Attribute 
{ 
} 

e voglio applicarlo a metodi su diverse classi in diverse assemblee. ..

Quindi voglio ottenere un MethodInfo per tutti i metodi a cui è applicato questo attributo. Devo cercare l'intero AppDomain e ottenere un riferimento a tutti questi metodi.

So che possiamo ottenere tutti i tipi e quindi ottenere tutti i metodi, ma c'è un modo più veloce/migliore per fare questo? ... o è questo il modo più veloce per ottenere le informazioni di cui ho bisogno?

(sto usando ASP.NET MVC 1.0, C#, ./NET 3.5)

cumuli Grazie!

risposta

14

In definitiva, no, è necessario digitalizzarli. LINQ lo rende abbastanza indolore anche se.

 var qry = from asm in AppDomain.CurrentDomain.GetAssemblies() 
        from type in asm.GetTypes() 
        from method in type.GetMethods() 
        where Attribute.IsDefined(method, typeof(MyAttribute)) 
        select method; 

Nota questo solo scansioni caricato assiemi "come è".

+0

Grazie per questo Marc! E per la query linq ... e l'avvertimento ... Aiuta me e anche altri sono sicuro. Sto usando ASP.NET MVC ... ho fatto il test re: caricamento di classi in ASP.NET perché ho scoperto che alcuni dei miei test di unità non caricavano gli assembly esterni a meno che non si fosse fatto riferimento a un tipo ... ASP.NET sembra Per fortuna, carica tutto nell'AppDomain ... Grazie ancora. – jwwishart

0

L'ho cercato anche poche settimane fa. Penso che non ci sia un modo più semplice.
Potresti riuscire a dare un po 'di risalto a LINQ.

+0

Era quello che pensavo anche io! Grazie – jwwishart

2

Una cosa da considerare è un attributo aggiuntivo che è possibile applicare a una classe/struttura, indicando che sono contrassegnati zero o più metodi di quel tipo. Questo dovrebbe darti almeno un miglioramento della performance in ordine di grandezza.

Se l'attributo è definito dall'utente (non incorporato nel framework .NET), quando si enumerano gli assembly per ottenere i tipi, è necessario saltare gli assembly framework come mscorlib e System.

+0

Grazie per i suggerimenti perf! Mi piacerebbe votare se potessi ... – jwwishart

2

Se è davvero necessario il guadagno di prestazioni, fare come Marc suggested e quindi memorizzare i risultati in un file. Al successivo caricamento dell'applicazione, se il file memorizzato nella cache esiste, è possibile caricare il metodo appropriato senza analizzare tutti gli assembly.

Ecco un esempio di una possibile file di cache:

<attributeCache> 

    <assembly name='Assembly1' filename='Assembly1.dll' timestamp='02/02/2010'> 
    <type name='Assembly1.Type1'> 
     <method name='Method1'/> 
    </type> 
    </assembly> 

<assembly name='Assembly2' filename='Assembly2.dll' timestamp='02/02/2010' /> 
</attributeCache>