2011-01-31 7 views
26

¿Hay alguna manera elegante de obtener todos los tipos en un ensamblado que tenga un atributo personalizado?obtener todos los tipos en ensamblado con el atributo personalizado

Así que si tengo una clase

[Findable] 
public class MyFindableClass 
{} 

Me gustaría ser capaz de encontrarlo en una colección de tipos devueltos por Assembly.GetTypes (...)

puedo hacerlo con un gran hack vil, pero estoy seguro de que alguien tiene una manera más agradable.

+2

No estoy seguro de lo que está considerando un "gran vil hack", pero si se trata de un bucle simple, no es un truco; es una buena solución –

+0

posible duplicado de [C# - ¿cómo se enumeran todas las clases con atributo de clase personalizado?] (Http://stackoverflow.com/questions/607178/c-sharp-how-enumerate-all-classes-with-custom-class-attribute) – nawfal

+0

Pregunta de corolario importante ¿Cómo leo un atributo en una clase en tiempo de ejecución? http://stackoverflow.com/questions/2656189/how-do-i-read-an-attribute-on-a-class-at-runtime –

Respuesta

45

Yo no creo que se pueda esquivar la enumeración de todos los tipos en el montaje, la comprobación de atributo, pero se puede usar LINQ para hacer la consulta más fácil de entender:

Assembly assembly = ... 
var types = from type in assembly.GetTypes() 
      where Attribute.IsDefined(type, typeof(FindableAttribute)) 
      select type; 

EDIT: Se trasladó de MemberInfo.GetCustomAttributes a Attribute.IsDefined según la sugerencia de Marc Gravell.

+3

Estrictamente hablando, Attribute.IsDefined (type, attribType) sería más eficiente aquí –

+1

@Marc: Genial, ¿te importa si edito eso? – Ani

+0

Vaya para eso, claro. –

Cuestiones relacionadas