Saya telah mencoba berkali-kali tetapi masih tidak dapat memahami penggunaan atribut khusus (saya telah melalui banyak tautan).
Adakah yang bisa menjelaskan kepada saya contoh yang sangat dasar dari atribut khusus dengan kode?
sumber
Saya telah mencoba berkali-kali tetapi masih tidak dapat memahami penggunaan atribut khusus (saya telah melalui banyak tautan).
Adakah yang bisa menjelaskan kepada saya contoh yang sangat dasar dari atribut khusus dengan kode?
Meskipun kode untuk membuat Atribut khusus cukup sederhana, sangat penting bagi Anda untuk memahami apa itu atribut:
Atribut adalah metadata yang dikompilasi ke dalam program Anda. Atribut itu sendiri tidak menambahkan fungsionalitas apa pun ke kelas, properti, atau modul - hanya data. Namun, dengan menggunakan refleksi, seseorang dapat memanfaatkan atribut tersebut untuk menciptakan fungsionalitas.
Jadi, sebagai contoh, mari kita lihat Blok Aplikasi Validasi , dari Perpustakaan Perusahaan Microsoft . Jika Anda melihat contoh kode, Anda akan melihat:
/// <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; }
Dari potongan di atas, orang mungkin menebak bahwa kode akan selalu divalidasi, setiap kali diubah, sesuai dengan aturan Validator (dalam contoh, memiliki setidaknya 8 karakter dan paling banyak 8 karakter). Tetapi kenyataannya adalah bahwa Atribut tidak melakukan apa-apa; seperti yang disebutkan sebelumnya, ini hanya menambahkan metadata ke properti.
Namun, Enterprise Library memiliki Validation.Validate
metode yang akan melihat objek Anda, dan untuk setiap properti, akan memeriksa apakah konten melanggar aturan yang diinformasikan oleh atribut.
Jadi, begitulah seharusnya Anda memikirkan atribut - cara untuk menambahkan data ke kode Anda yang mungkin nantinya digunakan oleh metode / kelas / dll.
Anda mulai dengan menulis kelas yang berasal dari Atribut :
Kemudian Anda bisa mendekorasi apa saja (class, method, property, ...) dengan atribut ini:
dan akhirnya Anda akan menggunakan refleksi untuk mengambilnya:
Anda dapat membatasi jenis target tempat atribut khusus ini dapat diterapkan menggunakan atribut AttributeUsage :
Hal penting yang perlu diketahui tentang atribut:
sumber
var value = typeof(Foo).GetCustomAttributes<MyCustomAttribute>().First().SomeProperty;
Memanfaatkan / Menyalin respons bagus Darin Dimitrov , berikut adalah cara mengakses atribut khusus pada properti dan bukan kelas:
Properti yang didekorasi [kelas
Foo
]:Mengambilnya:
Anda dapat melempar ini dalam satu putaran dan menggunakan refleksi untuk mengakses atribut khusus ini pada setiap properti kelas
Foo
, juga:Terima kasih banyak untukmu, Darin !!
sumber
object[] attribute = propertyInfo.GetCustomAttributes(typeof(???), true);
Saya hanya ingin mengulang semuanya dan memanggil metodem1()
dari setiap atribut yang tidak diketahuiJawaban singkatnya adalah untuk membuat atribut di c # Anda hanya perlu mewarisinya dari kelas Atribut, Hanya ini :)
Tapi di sini saya akan menjelaskan atribut secara detail:
pada dasarnya atribut adalah kelas yang dapat kita gunakan untuk menerapkan logika kita ke rakitan, kelas, metode, properti, bidang, ...
Di .Net, Microsoft telah menyediakan beberapa Atribut yang telah ditentukan sebelumnya seperti Atribut Kedaluwarsa atau Validasi seperti ([Wajib], [Panjang String (100)], [Rentang (0, 999,99)]), juga kami memiliki jenis atribut seperti ActionFilters di asp.net yang bisa sangat berguna untuk menerapkan logika yang kita inginkan ke kode kita (baca artikel ini tentang filter tindakan jika Anda ingin mempelajarinya)
satu sama lain, Anda dapat menerapkan semacam konfigurasi pada atribut Anda melalui AttibuteUsage.
Ketika Anda mendekorasi kelas atribut dengan AttributeUsage, Anda dapat memberi tahu c # compiler di mana saya akan menggunakan atribut ini: Saya akan menggunakan ini di kelas, pada rakitan pada properti atau di ... dan atribut saya diizinkan untuk digunakan beberapa kali pada target yang ditentukan (kelas, rakitan, properti, ...) atau tidak ?!
Setelah definisi tentang atribut ini, saya akan menunjukkan kepada Anda sebuah contoh: Bayangkan kita ingin mendefinisikan pelajaran baru di universitas dan kita ingin mengizinkan hanya admin dan master di universitas kita untuk menentukan Pelajaran baru, Ok?
Dalam dunia nyata pemrograman mungkin kita tidak menggunakan pendekatan ini untuk menggunakan atribut dan saya mengatakan ini karena poin edukasinya dalam menggunakan atribut
sumber