Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# 11 İle Gelen Generic Attribute Yapılanması

Merhaba,

Bu içeriğimizde C# programlama dilinin 11. versiyonunda gelerek büyük bir eksikliği giderecek olan ve mimarisel çalışmalarda tür/type ile ilgili manevralarda kodumuza/yapımıza oldukça esneklik kazandıracak olan Generic Attribute özelliğini inceliyor olacağız.

Esasında C# 11 öncesi sürümlerde, attribute’ların generic olabilmesi desteklenmediğinden dolayı, bu özellikle pratik bir şekilde çözüm getirilebilecek senaryolarda farklı ve zahmetli yaklaşımlara yönelerek ne kadar ihtiyaç duyulabilir ve kritik bir yapı olduğuna dair kanaat getirdiğimiz, ‘ulan şu attribute’ları da generic olarak ayarlayabileydik keşke’ şeklinde serzenişlerde bulunduğumuz pek çok tecrübemiz olmuştur. Aynı şekilde sizlerin de en az benim kadar bu özelliğin olmasını istediğiniz durumlar yaşadığınıza inanıyorum. İşte böyle ihtiyaç hissedilmiş bir maziye sahip olan bir özelliğin yeni olarak dile katılım gösterdiği süreçte pekte bu özellikle ilgili tanıtım yapılabilecek bir yanının olmadığı kanaatindeyim. Nihayetinde ihtiyacını bilenler için oldukça lüzumlu bir özellikken, bilmeyenler için ise artık attribute kavramının parçası olarak değerlendirilebilecek bir niteliktir.

Şimdi bizler içeriğimize bu özelliği bekleyenlerin hissiyatıyla devam edelim.

Peki hoca, bu generic attribute özelliği gelmeden önce attribute’lar da ki türle ilgili işlemleri nasıl gerçekleştiriyordunuz? şeklinde ilgili özelliğin evveliyatını değerlendirmemizi sağlayacak kritik bir soruyla seyredelim istiyorum.

Evet, eskiden attribute’lar da tür işlemleri gerçekleştirirken ‘Type’ türünden aşağıdaki gibi istifade ederek işlemlerimizi gerçekleştiriyorduk.

class TypeAttribute : Attribute
{
    public Type Type { get; }
    public TypeAttribute(Type type)
        => Type = type;
}

Yukarıdaki kod bloğunu incelerseniz eğer farazi amaçlı oluşturulmuş olan ‘TypeAttribute’ isimli attribute’un içerisinde bir tür tanımlaması yapabilmek için ‘Type’ türünden bir referans tutmaktayız. Bu referans üzerinden yapılacak operasyon için gerekli tür tanımlamasını aşağıdaki gibi gerçekleştirmekteyiz.

[Type(typeof(int))]
class MyClass { }

İşte generic attributes özelliğinden önce bu şekilde bir çalışma sergiliyorduk.

Halbuki generic attributes özelliği sayesinde artık attribute tanımlamalarında aşağıdaki gibi generic tanımlamada bulunabiliyor ve böylece yapıyı komple generic hale getirebiliyoruz.

class TypeAttribute<T> : Attribute
{

}

Kullanım olarak da aşağıdaki gibi oldukça basit ve sade bir davranuş sergilememizi sağlamaktadır.

[Type<int>()]
class MyClass { }

Tabi bu özelliğinde belirli sınırlamaları mevcuttur. Misal olarak generic sınıflarda, generic attribute’ları kullanırken akla gelebileceği gibi direkt olarak generic parametreleri kullanamamaktayız.
C# 11 İle Gelen Generic Attribute YapılanmasıAnlayacağınız böyle bir durumda generic tür direkt olarak bildirilmelidir.

Ayrıca generic attribute’lar da aşağıdaki türler desteklenmemektedir;

  • dynamic
  • nint
  • nuint
  • string? (Burada int?, float? gibi primitive olan türlerin nullable’larının desteklendiğini unutmayınız!)
  • (int a, int b) (Tuple)

Bunların yerine sırasıyla aşağıdaki türleri kullanabilirsiniz;

  • object
  • IntPtr
  • UIntPtr
  • string
  • ValueTuple<int, int>

Nihai olarak;
C#, olması gerekeni yapmış ve attribute’lara generic desteğini kazandırmıştır. Artık ihtiyaç duyulan noktalarda gönül rahatlığıyla kullanabilir ve ohh be diyebiliriz 🙂

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. Murad dedi ki:

    Oh bee)))

  2. Ferhat Karabulut dedi ki:

    Ben bunun nerede kullanıldığını anlayamadım. Yani ne oldu da generic type attribute ihtiyaç duydunuz? Gençay Bey lütfen reallife bir code parçaçığı paylaşabilir misiniz?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir