Bagaimana bekerja dengan atribut di C #

Atribut adalah fitur yang ampuh dalam bahasa pemrograman C # yang dapat menambahkan informasi metadata ke rakitan Anda.

Atribut sebenarnya adalah objek yang terkait dengan salah satu elemen berikut: Assembly, Class, Method, Delegate, Enum, Event, Field, Interface, Property dan Struct. Mereka dapat digunakan untuk mengasosiasikan informasi deklaratif - Anda dapat mengambil informasi tersebut pada waktu proses di lain waktu jika perlu menggunakan refleksi. Dengan kata lain, Anda dapat menggunakan atribut untuk memasukkan informasi tambahan ke rakitan yang dapat dikueri saat runtime jika diperlukan menggunakan refleksi. Atribut terdiri dari namanya dan secara opsional, daftar parameter. Nama atribut sesuai dengan kelas atribut.

Anda dapat memanfaatkan atribut untuk memvalidasi objek bisnis di aplikasi Anda. Ada dua jenis atribut - atribut intrinsik dan atribut khusus. Sementara yang pertama tersedia sebagai bagian dari kerangka .Net, yang terakhir dapat diimplementasikan dengan menurunkan kelas dari kelas System.Attribute. MSDN menyatakan: "Atribut adalah bagian dari informasi deklaratif tambahan yang ditentukan untuk deklarasi."

Sekarang mari kita masuk ke beberapa kode. Atribut Usang dapat digunakan untuk menunjukkan metode sebagai usang - metode yang tidak boleh digunakan lagi karena tidak lagi diperlukan atau mungkin memiliki alternatif lain. Cuplikan kode berikut menggambarkan bagaimana Anda dapat menggunakan atribut Usang di atas deklarasi metode.

[Obsolete("This method is obsolete...")]

        public static void DoSomeWork()

        {

            //Some code

        }

Jika Anda menggunakan metode ini dalam kode Anda dan mengkompilasi program Anda, Anda akan melihat peringatan yang ditampilkan di jendela keluaran Visual Studio IDE. Jadi, Anda bisa mengabaikan peringatan ini jika Anda mau. Sekarang, bagaimana jika Anda ingin pengembang Anda tidak menggunakan metode ini sama sekali? Nah, Anda kemudian dapat menggunakan parameter kedua (ini opsional) saat mendeklarasikan atribut Usang. Berikut adalah versi modifikasi dari metode DoSomeWork (). Perhatikan penggunaan parameter Boolean kali ini.

[Obsolete("This method is obsolete...", true)]

        public static void DoSomeWork()

        {

                       //Some code

        }                                                                                                                        

Saat Anda mengirimkan "true" sebagai parameter opsional kedua kali ini dan mengkompilasi program Anda, kode tidak akan dapat dikompilasi sama sekali. Itulah yang ingin Anda lakukan, bukan?

Atribut khusus

Di bagian ini kita akan mempelajari bagaimana kita dapat menerapkan atribut khusus. Atribut khusus adalah kelas yang mewarisi kelas System.Attribute. Jadi, untuk mengimplementasikan kelas atribut khusus, buat kelas baru dan turunkan dari kelas System.Attribute seperti yang ditunjukkan di bawah ini.

using System;

public class CustomAttribute : Attribute

{

}

Untuk mengontrol penggunaan atribut khusus, Anda dapat memanfaatkan kelas AttributeUsage. Kelas ini berisi properti seperti, ValidOn, AllowMultiple dan Inherited yang dapat digunakan untuk mengontrol penggunaan atribut khusus Anda.

Cuplikan kode berikut mengilustrasikan versi modifikasi dari kelas atribut khusus kami. Perhatikan penggunaan konstruktor yang menerima string sebagai argumen dan menetapkannya ke anggota string pribadi kelas. Ini hanya untuk tujuan ilustrasi saja.

[AttributeUsage(AttributeTargets.All)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

Anda juga dapat menentukan target atribut tempat atribut khusus Anda harus diterapkan. Inilah cara Anda melakukannya.

[AttributeUsage(AttributeTargets.Class |

AttributeTargets.Constructor |

AttributeTargets.Field |

AttributeTargets.Method |

AttributeTargets.Property,

AllowMultiple = true)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

Anda sekarang dapat menggunakan refleksi untuk menampilkan semua atribut yang diterapkan ke objek tertentu menggunakan potongan kode berikut.

MemberInfo memberInfo = typeof(CustomAttribute);

object[] attributes = memberInfo.GetCustomAttributes(true);

for (int i = 0, j = attributes.Length; i < j; i++)

  {

     Console.WriteLine(attributes[i]);

  }

Sekarang pertimbangkan kelas berikut di mana kami akan menerapkan atribut khusus kami.

[CustomAttribute("Hello World...")]

public class SomeClass

{

}

Perhatikan bagaimana atribut khusus telah digunakan dan teks diteruskan sebagai argumen untuknya. Potongan kode berikut mengilustrasikan bagaimana Anda dapat mencetak konten properti Text.

MemberInfo memberInfo = typeof(SomeClass);

object[] attributes = memberInfo.GetCustomAttributes(true);

foreach (object attribute in attributes)

{

CustomAttribute customAttribute = attribute as CustomAttribute;

if (customAttribute != null)

Console.WriteLine("Text = {0}", customAttribute.Text);

else

Console.WriteLine();

}