Makale Özeti

Bildiğiniz gibi Attribute mekanizması method, class, property gibi programlamanın temel taşlarınının özniteliklerini belirler. Bu makale kendi attribute'lerinizi yapmayı anlatır

Makale

Bildiğiniz gibi Attribute mekanizması method, class, property gibi programlamanın temel taşlarınının özniteliklerini belirler. Bir başka deyişle yazılan kodun metadata bilgisinin genişletilmesini sağlar.

Kullanımını hatırlayacak olursak;

[WebMethod(true)]

public string HelloWorld()

{

      return "Hello World";

}

[WebMethod(true)] attribute’ü bu method’un web üzerinden sunulan web servisindeki bir method olduğunu ve aldığı parametre ise session özelliğinin aktif olduğunu belirler.

.Net bize kendi attribute’ümüzü yapmamızı sağlıyor. Bunu yapabilmek için oluşturulan class’ın System.Attribute sınıfından türetilmesi gerekiyor.

public class OznitelikBilgisi : System.Attribute

{

}

Oluşturulan bu class artık attribute olarak kullanılabilir niteliktedir. Peki bu yazdığımız attribute nerelerde kullanılacak ? Attribute’lerin sadece method’larda, class’larda, property’lerde kullanılmasını sağlayabiliriz. Bunun için yine attribute’den yararlanıyoruz. AttributeUsage attribute’ü oluşturulan attribute’ün kullanım yerini belirler. Bu kullanım yerleri AttributeTargets enumerator sayesinde belirtilir ve aşağıdaki değerleri alabilir :

·         All

·         Assembly

·         Class

·         Constructor

·         Delegate

·         Enum

·         Event

·         Field

·         Interface

·         Method

·         Module

·         Parameter

·         Property

·         ReturnValue

·         Struct

 Senaryomuza göre kendi attribute’ümüz sadece class ve method’larda kullanılabilir. Eğer belirtilmezse her yerde kullanılabilir. Attribute içerisinde kullanılan ikinci parametre AllowMultiple parametresidir.Bu parametre ise aynı yerde aynı attribute’ü birden fazla kez kullanıp kullanamayacağımızı belirler. Biz, method’a her müdahale eden programcının attribute eklemeyebilmesi için AllowMultiple parametresini true olarak belirtiyoruz.

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple=true)]

public class OznitelikBilgisi : System.Attribute

    {

    }

Attribute tanımlamasını bitirdikten sonra sıra geldi attribute içerisinde tutmamız gereken bilgilere. Yine örnek senaryomuza göre Method veya Class’ı oluşuturan kullanıcının, adını soyadını, açıklama ve oluşturulma tarihini tutalım .

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple=true)]

    public class OznitelikBilgisi : System.Attribute

    {

        private string _Yazar;

        private string _OlusturulmaZamani;

        private string _Aciklama;

 

        public string Aciklama

        {

            get { return _Aciklama; }

            set { _Aciklama = value; }

        }

         public string Yazar

        {

            get { return _Yazar; }

            set { _Yazar = value; }

        }

        public string OlusturulmaZamani

        {

            get { return _OlusturulmaZamani; }

            set { _OlusturulmaZamani = value; }

        }

        public OznitelikBilgisi(string yazar,string aciklama, string olusturulmaZamani)

        {

            this.Yazar = yazar;

            this.OlusturulmaZamani = olusturulmaZamani;

            this.Aciklama = aciklama;

        }

     }

Oluşturduğumuz örnek attribute’ü artık Class ve Method’larda kullanabiliriz.

 

Aynı attribute’ü birden fazla kez kullanımına izin verdiğimiz için bir daha kullanabiliriz.

[OznitelikBilgisi("Okan Tekeli", "Method Oluşturuldu" , "02.07.2006")]

[OznitelikBilgisi("Okan Tekeli", "Method Değiştirildi", "04.07.2006")]

public int GetCustomerCount()

{

       return 6;

}

Kendi attribute’ümüzü oluşturduk ve kullandık. Peki bu attribute’ün kullanıldığı method’lardan attribute değerlerini nasıl alabiliriz? Attribute bilgisini alabilmek için Reflection’dan yararlanmamız gerekiyor. Örnek bir windows uygulaması yapıp method’un attribute bilgisini alalım.

 

 private void btnAttributeBilgileri_Click(object sender, EventArgs e)

        {

            Customers c = new Customers();

            Type tip = c.GetType();

            // GetCustomerCount method bilgisini al

            MethodInfo methodBilgisi = tip.GetMethod("GetCustomerCount");

            // Belirtilen methoddaki OznitelikBilgisi tipindeki CustomAttribute'leri Al ve diziye aktar

            object[] attributeArray = methodBilgisi.GetCustomAttributes(typeof(OznitelikBilgisi), false);

            // Dizideki tüm attribute'leri ekrana yazdır

            foreach (Attribute myAttribute in attributeArray)

            {

                  ListViewItem eleman = new ListViewItem();

                  eleman.Text = ((OznitelikBilgisi)myAttribute).Yazar;

                  eleman.SubItems.Add(((OznitelikBilgisi)myAttribute).Aciklama);

                  eleman.SubItems.Add(((OznitelikBilgisi)myAttribute).OlusturulmaZamani);

                  lstViewBilgiler.Items.Add(eleman);                    

            }

        }

Sonuç olarak ekrana method’da kullanılan attribute bilgileri geliyor. Gelen bilgiler bizim oluşturduğumuz attribute’e ait ama aynı yönlemle herhangi bir attribute bilgisini de alabilirsiniz.  

 

Bir başka makalede görüşmek üzere 

Okan Tekeli

okan.tekeli@bilgeadam.com

okan@okantekeli.com

 

Makale Örneği