Chociaż kod utworzyć niestandardowy Attribute jest dość prosta, to znacznie ważne, aby zrozumieć, jakie są atrybuty:
atrybuty metadanych skompilowane do swojego programu. Same atrybuty nie dodają żadnej funkcjonalności do klasy, własności lub modułu, tylko dane. Jednak za pomocą refleksji można wykorzystać te atrybuty w celu stworzenia funkcjonalności.
Na przykład przyjrzyjmy się Validation Application Block, od Enterprise Library. Jeśli spojrzeć na przykład kodu, 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; }
Od fragmencie powyżej, można się domyślać, że kod będzie zawsze być zatwierdzone, gdy zmienił się odpowiednio do zasad Validator (w tym przykładzie, mieć co najmniej 8 znaków i maksymalnie 8 znaków). Ale prawda jest taka, że atrybut nic nie robi, tylko dodaje metadane do nieruchomości.
Jednak biblioteka korporacyjna ma metodę Validation.Validate
, która zajmie się twoim obiektem, a dla każdej właściwości sprawdzi, czy zawartość narusza regułę informowaną przez atrybut.
A więc tak powinieneś pomyśleć o atrybutach - sposobie dodawania danych do kodu, które mogą być później użyte przez inne metody/klasy/etc.
Czy naprawdę podoba mi się odpowiedź i specjalnie ", jeszcze jedno pytanie mogę umieścić ten sam warunek w zestawie instrukcji powyższego kodu, więc jak to różni się od atrybutów, –
@slash: Czy możesz zmienić zdanie? Nie bardzo rozumiałem pytanie –
Myślę, że slash miał na celu zapytać o różnicę między używaniem atrybutów i umieszczaniem rzeczywistego kodu walidacyjnego w ustawieniach właściwości. Odpowiedź: Podczas pisania kodu wewnątrz settera można zrobić, aby potwierdzić wartość, użycie samych atrybutów nie sprawdzi poprawności jako takiej. Atrybuty to tylko "meta-dane", a inny kod gdzieś indziej powinien być zainteresowany atrybutami, których używasz, czytać je i wykonywać działania na ich podstawie.Typowym przykładem jest biblioteka walidacji, jak wspomniano @BrunoBrant. – romar