2013-07-30 18 views
13

Pracowałem z Reflections i chciałem uzyskać wszystkie atrybuty zadeklarowane dla właściwości. Istnieją dwie właściwości pod klasą PropertInfo, które są CustomAttributes i Attributes.Atrybuty a niestandardowe atrybuty w PropertyInfo

Według MSDN, są wyjaśnione następująco:

cechami:

Ta właściwość reprezentuje cech związanych z elementem. Wszystkie elementy członkowskie mają zestaw atrybutów zdefiniowanych w odniesieniu do określonego typu elementu . Atrybuty właściwości informują użytkownika, czy ta właściwość jest domyślną, właściwością SpecialName, a więc włączona.

Uwaga: Próbka kod podany na stronie PropertyInfo.Attributes nawet nie działa.

klienta atrybutów:

tablicę, która zawiera wszystkie atrybuty niestandardowe stosowane do tego członka albo z tablicy zerowej elementy, jeśli ma cechy są zdefiniowane.

Jednak gdy uruchamiam ten kod dla nich Attributes nic nie zwraca natomiast CustomAttributes powraca Required.

void Main() 
{ 
    var attributes = typeof(Myproperty).GetProperty("Caption").CustomAttributes; 
    //var attributes = typeof(Myproperty).GetProperty("Caption").Attributes; 
    attributes.Dump(); //Dump is a LinqPad method which dumps everything to the outpu window 
} 

public class Myproperty 
{ 
    private string caption = "Default caption"; 

    [Required] 
    public string Caption 
    { 
     get{return caption;} 
     set {if(caption!=value) {caption = value;} 
     } 
    } 
} 
+0

Zasadniczo są tu nieco inne znaczenia słowa "atrybut". Wygląda na to, że chcesz CustomAttributes. –

+0

Domyślam się, że to, czego chciałem, to "CustomAttributes", ale czy możesz wyjaśnić, na czym polega różnica? IMO wydaje się, że nie robi tego, co sugeruje jego nazwa. – Tarik

+1

Zasadniczo patrz odpowiedź Hansa. To bardzo różne rzeczy. Spójrz na MethodInfo.Attributes na przykład, który może mieć dla ciebie więcej sensu - bardziej przypomina modyfikatory, które można zastosować do właściwości/metody/itp. –

Odpowiedz

16

PropertyInfo.Attributes nie ma nic wspólnego z klasą Atrybut. Sprawdź wartości PropertyAttributes enumeration pod kątem wartości, które możesz napotkać. Są to szczegóły implementacji CLR, które nie mają oczywistego połączenia z kodem C#. Tak, to był niefortunny wybór nazwy.

Aby znaleźć atrybuty, takie jak atrybut [Wymagany], należy użyć właściwości CustomAttributes.

+0

Może powinienem spędzić więcej czasu z ILSpy ... – Tarik

Powiązane problemy