Я думаю, вы можете оптимизировать это, но это зависит от того, как атрибуты размещены в методах и типах. Если вы знаете, что все ваши типы и / или методы со специальным атрибутом определены в определенных сборках, вы можете сканировать только эти сборки.
Также вы можете определить некоторые методы, такие как:
- IEnumerable<Type> GetAllTypesFromAssemblyByAttribute<TAttribute>(Assembly assembly) where TAttribute : Attribute
- IEnumerable<MethodInfo> GetAllMethodsFromTypeByAttribute<TAttribute>(Type type) where TAttribute : Attribute
и используйте эти методы в своем основном методе сканирования.
Таким образом, ваш метод сканирования результатов может выглядеть следующим образом:
private void ScanAndDoSmth<TAttribute>(IEnumerable<Assembly> assemblies)
where TAttribute : Attribute
{
var result =
from assembly in assemblies
from type in GetAllTypesFromAssemblyByAttribute<TAttribute>(assembly)
let attributes = type.GetCustomAttributes(typeof(TAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = type, Attributes = attributes.Cast<TAttribute>();
}