18 Ocak 2018 Perşembe

C# Attributes (Nitelikler) - Yazı Serisi - 3


Merhaba,

Daha önceki yazı serilerimizde Runtime Type Identification ve Reflection'dan bahsetmiştik. Bu yazıda da aslında Reflection'un bir parçası olan "Nitelikler"i ele alacağız.

Nitelikler de aslında Reflection'un bir parçasıdır ve çalışma zamanında uygulanan nesneye özellik katarlar. Başka bir deyişle nitelikler bir sınıf, yapı, metot ve benzerleri için bir metadata tanımlarlar. Bir class yapısı düşünün, bir özelliği olsun ve bu özelliği istediğimiz zaman kullanabilelim. İlk bakıldığında bu iş için properties'ler uygun gibi görünebilir ama bu tek bir özellik için o kadar da şık bir kullanım olmayacaktır. Hem kullanıcı her nesne oluşturduğunda bu özelliğe atama yapmayı unutabilir hem de reflection yapısı için uygun bir tercih olmayacaktır. İşte her bir yapının sahip olabileceği bu özellikler nitelikler (attributes) ile çok kullanışlı hale gelmektedir.

Bir nitelik, System.Attribute'den türemiş olmalıdır. Yani siz bir nitelik tanımlamak isterseniz, bu niteliğinizi her koşulda System.Attribute'den türetmelisiniz. Bir nitelik sınıfı tanımlarken de AttributeUsage adlı nitelik yazılmalıdır. AttributeUsage bu niteliğin hangi öğelere uygulanabileceğini tanımlar.

Aşağıda, bulunduğu öğeyi tarif eden özellikte basit bir nitelik örneği mevcuttur:

using System; [AttributeUsage(AttributeTargets.All)] public class MyAttribute : Attribute { public string AttributeParameter1 {get; set; } string strExplain; public MyAttribute(string _strExplain) { strExplain = _strExplain; AttributeParameter1 = "My attribute parameter value"; } public string Explain { get { return strExplain; } } } [MyAttribute("My attribute explain", AttributeParameter1="Dışardan parametre")] public class DenemeAttribute { //...... } public class UseAttribute { static void Main(string[] args) { Type t = typeof(DenemeAttribute); Console.WriteLine(t.Name + "'in nitelikleri"); object[] attributes = t.GetCustomAttributes(false); foreach (object o in attributes) { Console.WriteLine(o); } //Niteliği okuyalım Type tAttribute = typeof(MyAttribute); MyAttribute ma = (MyAttribute)Attribute.GetCustomAttribute(t, tAttribute); Console.WriteLine(ma.Explain);//Konumsal parametre Console.WriteLine(ma.AttributeParameter1);//Adlandırılmış parametre Console.Read(); } }

Bu programın çıktısı aşağıdaki gibidir:

DenemeAttribute'in nitelikleri
MyAttribute
My attribute explain
Dışardan parametre

Bu programda neler yaptık inceleyelim:

Öncelikle; MyAttribute adında bir attribute oluşturduk.

[AttributeUsage(AttributeTargets.All)]
public class MyAttribute : Attribute

"AttributeTargets.All" ifadesi attributenin uygulandığı classın bütün elemanlarına uygulanacağı anlamına gelir. Bunu sadece istediğiniz yapılara (class, constructor, method.. vs) uygulanacak şekilde uyarlayabilirsiniz. Attribute tanımının son ekinin "Attribute" olması zorunlu olmamakla birlikte tavsiye edilir ama bu attributeyi bir yapıya tahsis ederken "Attribute" son ekini vermesek de olur. Yani aşağıdaki iki tanım da geçerlidir:

[MyAttribute("My attribute explain")] public class DenemeAttribute { //...... } veya [My("My attribute explain")] public class DenemeAttribute { //...... }

iki tanım da geçerlidir

Attribute'u tanımlarken constructor ile konumlanmış parametreye dikkat ediniz, sadece get; olarak verilmiştir. Buna konumsal parametre denir ve attribute verirken parantezi takiben ilk verilen parametre grubudur. Sonra AttributeParameter1 propertiesi tanımlandı. Buna da adlandırılmış parametre denir ve bir yapıya attribute verirken bu parametre dışardan set edilebilir.

Nitelikler hakkında genel hatlarıyla bir bilgi vermiş olduk.

Faydalı olması dileğiyle..





Paylaş:

0 yorum:

Yorum Gönder

Bu Blogda Ara