Mam klasę, nazwijmy ją Zarezerwuj z właściwością o nazwie Nazwa. Z tą właściwością mam powiązany atrybut.
public class Book
{
[Author("AuthorName")]
public string Name
{
get; private set;
}
}
W mojej głównej metodzie używam refleksji i chcę uzyskać parę klucz-wartość dla każdego atrybutu dla każdej właściwości. Dlatego w tym przykładzie spodziewam się zobaczyć „Autor” dla nazwy atrybutu i „AutorName” dla wartości atrybutu.
Pytanie: Jak uzyskać nazwę i wartość atrybutu dla moich właściwości za pomocą Reflection?
c#
reflection
propertyinfo
developerdoug
źródło
źródło
Odpowiedzi:
Użyj,
typeof(Book).GetProperties()
aby uzyskać tablicęPropertyInfo
instancji. Następnie użyjGetCustomAttributes()
każdegoPropertyInfo
z nich, aby sprawdzić, czy któryś z nich maAuthor
typ atrybutu. Jeśli tak, możesz uzyskać nazwę właściwości z informacji o właściwości i wartości atrybutów z atrybutu.Coś wzdłuż tych linii, aby przeskanować typ w poszukiwaniu właściwości, które mają określony typ atrybutu i zwrócić dane w słowniku (zauważ, że można to uczynić bardziej dynamicznym poprzez przekazywanie typów do procedury):
źródło
Aby uzyskać wszystkie atrybuty właściwości ze słownika, użyj tego:
pamiętaj, aby zmienić z
false
na,true
jeśli chcesz dołączyć również odziedziczone atrybuty.źródło
Jeśli chcesz tylko jedną konkretną wartość atrybutu Na przykład Display Attribute, możesz użyć następującego kodu:
źródło
Rozwiązałem podobne problemy, pisząc Pomocnika atrybutu właściwości rozszerzenia ogólnego:
Stosowanie:
źródło
Fields
?Możesz użyć
GetCustomAttributesData()
iGetCustomAttributes()
:źródło
Jeśli masz na myśli „dla atrybutów, które biorą jeden parametr, wymień nazwy atrybutów i wartość parametru”, wtedy jest to łatwiejsze w .NET 4.5 poprzez
CustomAttributeData
API:źródło
źródło
Chociaż powyższe najbardziej uprzywilejowane odpowiedzi zdecydowanie działają, sugeruję zastosowanie nieco innego podejścia w niektórych przypadkach.
Jeśli klasa ma wiele właściwości z zawsze tym samym atrybutem i chcesz posortować te atrybuty w słowniku, oto jak to zrobić:
Nadal używa rzutowania, ale zapewnia, że rzutowanie będzie zawsze działać, ponieważ otrzymasz tylko niestandardowe atrybuty typu „AutorName”. Jeśli masz wiele atrybutów powyżej, odpowiedzi otrzymają wyjątek rzutowania.
źródło
Stosowanie:
lub:
źródło
Oto kilka metod statycznych, których można użyć do uzyskania wartości MaxLength lub dowolnego innego atrybutu.
Korzystanie z metody statycznej ...
Lub używając opcjonalnej metody rozszerzenia dla instancji ...
Lub używając pełnej metody statycznej dla dowolnego innego atrybutu (na przykład StringLength) ...
Zainspirowany odpowiedzią Mikaela Engvera.
źródło
Nekromancja.
Dla tych, którzy nadal muszą utrzymywać .NET 2.0, lub tych, którzy chcą to zrobić bez LINQ:
Przykładowe użycie:
lub po prostu
źródło
W tym przykładzie użyłem DisplayName zamiast Author, ponieważ ma pole o nazwie „DisplayName”, które ma być wyświetlane z wartością.
źródło
aby uzyskać atrybut z wyliczenia, używam:
// Za pomocą
źródło
Po prostu szukam odpowiedniego miejsca na umieszczenie tego fragmentu kodu.
powiedzmy, że masz następującą właściwość:
I chcesz uzyskać wartość ShortName. Możesz to zrobić:
Lub ogólnie:
źródło