2009-04-06 11 views
31

Tengo una biblioteca .NET en la que necesito encontrar todas las clases que tienen un atributo personalizado que he definido en ellas, y quiero poder encontrarlas en- el vuelo cuando una aplicación está usando mi biblioteca (es decir, no quiero un archivo de configuración en algún lugar donde indique el ensamblaje para buscar y/o los nombres de las clases).Encontrar todas las clases con un atributo en particular

que estaba viendo AppDomain.CurrentDomain pero no estoy demasiado familiarizado con ella y no está seguro de cómo elivated los privlages necesitan ser (yo quiero ser capaz de ejecutar la biblioteca en una aplicación web con la confianza mínima si es posible, pero cuanto menor sea la confianza, más feliz estaré). También quiero mantener el rendimiento en mente (es una biblioteca .NET 3.5, ¡así que LINQ es completamente válido!).

¿Mi opción mejor/única es AppDomain.CurrentDomain y luego simplemente recorre todos los ensamblajes y luego los ingresa? O hay otra manera

Respuesta

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

solución simple y viable. +1 por esto! –

+0

¡buenas cosas - los latidos tienen mucho de foreach! – Mike

+0

¡Esto es exactamente lo que necesitaba! ¡Gracias! –

0

Marcos registró una buena respuesta, pero aquí es una versión libre de LINQ si lo prefiere:

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; 
    } 
Cuestiones relacionadas