Ceci est une autre version du code fourni par Philip Trade-Ideas, J'ai condensé le code en linq, et l'ai inséré dans une belle fonction statique que vous pouvez simplement déposer dans le projet.
Original : https://stackoverflow.com/a/41411243/4122889
J'ai également ajouté AsParallel()
- sur ma machine avec suffisamment de cœurs, etc., et avec un projet de taille "normale" (ce qui est totalement subjectif), c'était le plus rapide et le plus efficace.
Sans AsParallel()
cela a pris 1,5 secondes pour environ 200 résultats, et avec cela, cela a pris environ quelques millisecondes - donc cela me semble le plus rapide.
Notez que cela ignore les assemblages dans le GAC.
private static IEnumerable<IEnumerable<T>> GetAllAttributesInAppDomain<T>()
{
var definedIn = typeof(T).Assembly.GetName().Name;
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var res = assemblies.AsParallel()
.Where(assembly => (!assembly.GlobalAssemblyCache) && ((assembly.GetName().Name == definedIn) ||
assembly.GetReferencedAssemblies()
.Any(a => a.Name == definedIn))
)
.SelectMany(c => c.GetTypes())
.Select(type => type.GetCustomAttributes(typeof(T), true)
.Cast<T>()
)
.Where(c => c.Any());
return res;
}
Utilisation :
var allAttributesInAppDomain = GetAllAttributesInAppDomain<ExportViewAttribute>();
Notez que si vous n'avez qu'un seul attribut par classe, et non plusieurs, il est plus facile d'aplatir le résultat à partir de IEnumerable<IEnumerable<T>>
a IEnumerable<T>
comme ça :
var allAttributesInAppDomainFlattened = allAttributesInAppDomain.SelectMany(c => c);
Rappelez-vous, cela utilise IEnumerable
alors appelez ToList()
pour exécuter réellement la fonction.