2011-01-31 8 views
26

Czy istnieje elegancki sposób na uzyskanie wszystkich typów w złożeniu, które mają niestandardowy atrybut?wszystkie typy w zestawie z atrybutem niestandardowym

Więc jeśli mam klasy

[Findable] 
public class MyFindableClass 
{} 

Chciałbym być w stanie go znaleźć w kolekcji typów zwracanych przez Assembly.GetTypes (...)

mogę zrobić z wielki podły hack, ale jestem pewien, że ktoś ma lepszy sposób.

+2

Nie jestem pewien, co masz na myśli "wielki podły hack", ale jeśli jest to prosta pętla for, to nie jest hack; to dobre rozwiązanie. –

+0

możliwy duplikat [C# - jak wyliczyć wszystkie klasy z niestandardowym atrybutem klasy?] (Http://stackoverflow.com/questions/607178/c-sharp-how-enumerate-all-classes-w-custom-class- attribute) – nawfal

+0

Ważne pytanie uzupełniające Jak odczytać atrybut z klasy w czasie wykonywania? http://stackoverflow.com/questions/2656189/how-do-i-read-an-attribute-on-a-class-at-runtime –

Odpowiedz

45

Nie sądzę, że można ograć wyliczanie każdy rodzaj w zespole, sprawdzając dla atrybutu, ale można użyć LINQ do kwerendy łatwiej zrozumieć:

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

EDIT: Przeniesiony z MemberInfo.GetCustomAttributes do Attribute.IsDefined na podstawie sugestii Marca Gravell'a.

+3

Ściśle mówiąc, Attribute.IsDefined (type, attribType) byłby bardziej wydajny tutaj –

+1

@Marc: Świetnie, czy mogę edytować to w? – Ani

+0

Idź po to - na pewno. –