2011-01-31 32 views
26

C'è un modo elegante per ottenere tutti i tipi in un assembly che hanno un attributo personalizzato?ottenere tutti i tipi in assembly con attributo personalizzato

Quindi, se ho una classe

[Findable] 
public class MyFindableClass 
{} 

Mi piacerebbe essere in grado di trovare in un insieme di tipi restituiti da Assembly.GetTypes (...)

posso farlo con un grosso vile trucco, ma sono sicuro che qualcuno ha un modo più carino.

+2

Non sono sicuro di cosa stai considerando un "grande vile hack", ma se è un ciclo semplice, non è un hack; è una buona soluzione. –

+0

possibile duplicato di [C# - come enumerare tutte le classi con attributo di classe personalizzato?] (Http://stackoverflow.com/questions/607178/c-sharp-how-enumerate-all-classes-with-custom-class-attribute) – nawfal

+0

Domanda corollario importante Come si legge un attributo su una classe in fase di esecuzione? http://stackoverflow.com/questions/2656189/how-do-i-read-an-attribute-on-a-class-at-runtime –

risposta

45

io non credo che si può schivare, enumerando ogni tipo nel montaggio, il controllo per l'attributo, ma si potrebbe usare LINQ per rendere la query più facile da capire:

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

EDIT: Spostato da MemberInfo.GetCustomAttributes a Attribute.IsDefined basato sul suggerimento di Marc Gravell.

+3

In senso stretto, Attribute.IsDefined (type, attribType) sarebbe più efficiente qui –

+1

@Marc: Bene, se lo modifichi? – Ani

+0

Vai per questo - certo. –

Problemi correlati