Próbowałem wiele razy, ale nadal nie jestem w stanie zrozumieć użycia atrybutów niestandardowych (przeszedłem już przez wiele linków).
Czy ktoś może mi wyjaśnić bardzo podstawowy przykład atrybutu niestandardowego z kodem?
źródło
Próbowałem wiele razy, ale nadal nie jestem w stanie zrozumieć użycia atrybutów niestandardowych (przeszedłem już przez wiele linków).
Czy ktoś może mi wyjaśnić bardzo podstawowy przykład atrybutu niestandardowego z kodem?
Chociaż kod służący do tworzenia niestandardowego atrybutu jest dość prosty, bardzo ważne jest, aby zrozumieć, czym są atrybuty:
Atrybuty to metadane wkompilowane w Twój program. Same atrybuty nie dodają żadnej funkcjonalności do klasy, właściwości czy modułu - tylko dane. Jednak korzystając z refleksji, można wykorzystać te atrybuty w celu stworzenia funkcjonalności.
Spójrzmy na przykład na Validation Application Block z biblioteki Enterprise Library firmy Microsoft . Jeśli spojrzysz na przykładowy kod, zobaczysz:
/// <summary>
/// blah blah code.
/// </summary>
[DataMember]
[StringLengthValidator(8, RangeBoundaryType.Inclusive, 8, RangeBoundaryType.Inclusive, MessageTemplate = "\"{1}\" must always have \"{4}\" characters.")]
public string Code { get; set; }
Z powyższego fragmentu można się domyślić, że kod będzie zawsze walidowany, po każdej zmianie, zgodnie z regułami Walidatora (w przykładzie ma co najmniej 8 znaków i maksymalnie 8 znaków). Ale prawda jest taka, że Atrybut nic nie robi; jak wspomniano wcześniej, dodaje tylko metadane do właściwości.
Jednak biblioteka korporacyjna ma Validation.Validate
metodę, która zajrzy do twojego obiektu i dla każdej właściwości sprawdzi, czy zawartość narusza regułę informowaną przez atrybut.
Tak więc powinieneś myśleć o atrybutach - sposobie dodawania danych do kodu, które mogą być później wykorzystane przez inne metody / klasy / itp.
Zaczynasz od napisania klasy, która pochodzi od Attribute :
Następnie możesz udekorować wszystko (klasę, metodę, właściwość, ...) tym atrybutem:
i na koniec użyłbyś refleksji, aby go pobrać:
Możesz ograniczyć typy docelowe, do których można zastosować ten atrybut niestandardowy, używając atrybutu AttributeUsage :
Ważne informacje o atrybutach:
źródło
var value = typeof(Foo).GetCustomAttributes<MyCustomAttribute>().First().SomeProperty;
Wykorzystując / kopiując świetną odpowiedź Darina Dimitrova , oto jak uzyskać dostęp do niestandardowego atrybutu na właściwości, a nie w klasie:
Urządzony majątek [klasy
Foo
]:Pobieram to:
Możesz wrzucić to do pętli i użyć odbicia, aby uzyskać dostęp do tego niestandardowego atrybutu dla każdej właściwości klasy
Foo
:Wielkie dzięki, Darin !!
źródło
object[] attribute = propertyInfo.GetCustomAttributes(typeof(???), true);
Chcę tylkom1()
Krótka odpowiedź jest taka, aby utworzyć atrybut w c # wystarczy odziedziczyć go z klasy Attribute, tylko to :)
Ale tutaj opiszę szczegółowo atrybuty:
w zasadzie atrybuty to klasy, których możemy użyć do zastosowania naszej logiki do zestawów, klas, metod, właściwości, pól, ...
W .Net firma Microsoft udostępniła pewne predefiniowane atrybuty, takie jak atrybuty przestarzałe lub walidacyjne, takie jak ([Wymagane], [StringLength (100)], [Zakres (0, 999,99)]). Mamy również atrybuty, takie jak ActionFilters w asp.net które mogą być bardzo przydatne do zastosowania naszej pożądanej logiki do naszych kodów (przeczytaj ten artykuł o filtrach akcji, jeśli jesteś pasjonatem, aby się go uczyć)
Po drugie, możesz zastosować rodzaj konfiguracji do swojego atrybutu za pośrednictwem AttibuteUsage.
Kiedy dekorujesz klasę atrybutu za pomocą AttributeUsage, możesz powiedzieć kompilatorowi C #, gdzie mam zamiar użyć tego atrybutu: zamierzam używać tego na klasach, w zestawach we właściwościach lub na ... i mój atrybut może być używany kilka razy na zdefiniowanych celach (klasy, zespoły, właściwości, ...) czy nie ?!
Po tej definicji atrybutów pokażę wam przykład: Wyobraź sobie, że chcemy zdefiniować nową lekcję na uniwersytecie i chcemy, aby tylko administratorzy i mistrzowie na naszej uczelni mogli zdefiniować nową lekcję, OK?
W prawdziwym świecie programowania być może nie używamy tego podejścia do używania atrybutów i powiedziałem to z powodu jego edukacyjnego punktu w używaniu atrybutów
źródło