2009-04-06 18 views
31

Ho una libreria .NET in cui ho bisogno di trovare tutte le classi che hanno un attributo personalizzato che ho definito su di esse, e voglio essere in grado di trovarle on- the-fly quando un'applicazione sta usando la mia libreria (es. - Non voglio un file di configurazione da qualche parte in cui dichiari l'assembly in cui cercare e/o i nomi delle classi).Trovare tutte le classi con un particolare attributo

stavo guardando AppDomain.CurrentDomain ma non sono eccessivamente familiarità con essa e non sicuro di come i elivated privlages devono essere (voglio essere in grado di eseguire la libreria in una Web App con un minimo di fiducia se possibile, ma più la fiducia è bassa, più sarei felice). Voglio anche tenere a mente le prestazioni (è una libreria .NET 3.5 quindi LINQ è completamente valido!).

Quindi è AppDomain.CurrentDomain la mia opzione migliore/solo e quindi solo il ciclo di tutti gli assembly e quindi i tipi in quegli assembly? O c'è un altro modo

risposta

80
IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit) 
           where TAttribute: System.Attribute 
{ return from a in AppDomain.CurrentDomain.GetAssemblies() 
      from t in a.GetTypes() 
      where t.IsDefined(typeof(TAttribute),inherit) 
      select t; 
} 
+1

soluzione semplice e praticabile. +1 per questo! –

+0

roba buona - i beat hanno un sacco di foreach! – Mike

+0

Questo è esattamente ciò di cui avevo bisogno! Grazie! –

0

Mark postato una buona risposta, ma qui è una versione gratuita LINQ se lo preferite:

public static IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit) where TAttribute : Attribute 
    { 
     var output = new List<Type>(); 

     var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

     foreach (var assembly in assemblies) 
     { 
      var assembly_types = assembly.GetTypes(); 

      foreach (var type in assembly_types) 
      { 
       if (type.IsDefined(typeof(TAttribute), inherit)) 
        output.Add(type); 
      } 
     } 

     return output; 
    } 
Problemi correlati