Por primera vez, he necesitado hacer un escaneo de ensamblaje manualmente. Me encontré con C# - how enumerate all classes with custom class attribute? que me creó conMejores prácticas para escanear todas las clases y métodos para el atributo personalizado
var typesWithMyAttribute =
(from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
let attributes = type.GetCustomAttributes(typeof(SomeAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = type, Attributes = attributes.Cast<SomeAttribute>() })
.ToList();
Qué era lo suficientemente simple para expandir a nivel de método
var methodsWithAttributes =
(from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
from method in type.GetMethods()
let attributes = method.GetCustomAttributes(typeof(SomeAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = type, Method = method,
Attributes = attributes.Cast<SomeAttribute>() })
.ToList();
¿Debo tratar de combinar estos 2 para hacer esto en una sola exploración o ¿Es eso solo caer en la optimización temprana? (el escaneo solo se ejecutará al inicio de la aplicación)
¿Hay algo diferente que sería más óptimo que hacer para el escaneo de los métodos ya que hay muchos más métodos que tipos en los ensamblajes?
Voy a apostar que la enumeración de las asambleas y tipos va a ser mucho más rápido que encontrar y crear instancias de sus atributos, de manera que el almacenamiento en caché de los conjuntos y tipos es va a ser inútil. – Gabe