2009-04-06 17 views
31

Mam bibliotekę .NET, w której muszę znaleźć wszystkie klasy, które mają zdefiniowany przez nich atrybut niestandardowy i chcę je znaleźć na stronie: w locie, gdy aplikacja korzysta z mojej biblioteki (tj. - nie chcę pliku konfiguracyjnego gdzieś, w którym umieszczam zestaw do przeglądania i/lub nazw klas).Znajdowanie wszystkich klas o określonym atrybucie

Szukałem na AppDomain.CurrentDomain ale nie jestem zbyt obeznany z tym i nie wiem, jak elivated się privlages muszą być (Chcę być w stanie uruchomić bibliotekę w Web App z minimalnym zaufania jeśli to możliwe, ale im niższa ufność, tym szczęśliwsza będę. Chcę również mieć na uwadze wydajność (jest to biblioteka .NET 3.5, więc LINQ jest całkowicie poprawny!).

Czy moja najlepsza/jedyna opcja to AppDomain.CurrentDomain, a następnie po prostu przechodzenie przez wszystkie złożenia, a następnie typy w tych złożeniach? Czy jest jakiś inny sposób

Odpowiedz

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

Prosta i praktycznym rozwiązaniem. +1 za to! –

+0

Dobre rzeczy - bity mają dużo foreach! – Mike

+0

To jest dokładnie to, czego potrzebowałem! Dzięki! –

0

Mark pisał dobrą odpowiedź, ale tutaj jest LINQ darmowa wersja, jeśli go wolisz:

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; 
    } 
Powiązane problemy