Menu
Coddy logo textTech

Attributes ve Reflection

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 44 / 70.

Öznitelikler, sınıflar, metotlar veya özellikler gibi kod öğelerine eklediğiniz meta veri etiketleridir. Kodun nasıl doğrudan çalıştırıldığını değiştirmezler, ancak çalışma zamanında okunabilecek bilgiler sağlarlar. Yansıma, bu meta verileri okuyan mekanizmadır.

Bir niteliği, hedef öğenin üzerinde köşeli parantezler içine yerleştirerek uygularsın:

[Obsolete("Use NewMethod instead")]
public void OldMethod() { }

[Serializable]
public class Person
{
    public string Name { get; set; }
}

Attribute sınıfından kalıtım alarak özel öznitelikler oluşturabilirsin:

public class AuthorAttribute : Attribute
{
    public string Name { get; }
    public AuthorAttribute(string name) => Name = name;
}

[Author("John")]
public class Calculator { }

Yansıma, System.Reflection ad alanını kullanarak çalışma zamanında türleri incelemenize ve öznitelikleri okumanıza olanak tanır:

Type type = typeof(Calculator);
var attr = type.GetCustomAttribute<AuthorAttribute>();
Console.WriteLine(attr.Name);  // John

Metotları ve özellikleri keşfedebilir, ayrıca bunları dinamik olarak çağırabilirsiniz:

MethodInfo[] methods = type.GetMethods();
foreach (var method in methods)
    Console.WriteLine(method.Name);

Öznitelikler ve yansıma, birçok framework’e güç verir - serileştirme kütüphaneleri JSON çıktısını denetlemek için bunları kullanır, test framework’leri test yöntemlerini keşfetmek için bunları kullanır ve bağımlılık ekleme kapsayıcıları hizmetleri otomatik olarak bağlamak için bunları kullanır.

challenge icon

Görev

Kolay

Özel öznitelikler ve yansımayı kullanarak eklenti olarak işaretlenmiş sınıfları otomatik olarak bulan ve açıklayan bir eklenti keşif sistemi oluşturalım. Bu, gerçek framework'lerin çalışma zamanında bileşenleri, test yöntemlerini veya API uç noktalarını keşfetme biçimine benzer.

Kodunuzu üç dosyaya ayıracaksınız:

  • PluginAttribute.cs: PluginAttribute ad alanında PluginSystem adlı özel bir öznitelik oluşturun. Özniteliğiniz:
    • Attribute'dan türemeli
    • Salt okunur iki özelliğe sahip olmalı: Name (string) ve Version (string)
    • Her iki değeri de oluşturucusu aracılığıyla kabul etmeli
  • Plugins.cs: PluginSystem ad alanında birkaç eklenti sınıfı oluşturun. Bazıları PluginAttribute ile süslenmeli, biri ise süslenmemeli:
    • ImageProcessor - [Plugin("Image Processor", "1.0")] ile işaretlenmiş
    • DataExporter - [Plugin("Data Exporter", "2.5")] ile işaretlenmiş
    • HelperUtility - herhangi bir öznitelikle işaretlenmemiş (bu yalnızca normal bir sınıftır)
    Her sınıf boş olabilir; yalnızca yansıma aracılığıyla meta verilerini keşfetmekle ilgileniyoruz.
  • Program.cs: Ana dosyanızda, PluginAttribute özniteliğine sahip tüm sınıfları keşfetmek için yansımayı kullanın. Keşfedilen her eklenti için bilgilerini yazdırın. Şunları yapmanız gerekecek:
    • Geçerli assembly'deki tüm türleri alın
    • Her türde PluginAttribute olup olmadığını denetleyin
    • Özniteliğin Name ve Version özelliklerini çıkarıp görüntüleyin

Türleri incelemek ve özel öznitelikleri almak için System.Reflection kullanın. GetCustomAttribute<T>() yöntemi, öznitelik mevcut değilse null döndürür; bu nedenle hangi sınıfların gerçek eklentiler olduğunu filtrelemek için bunu kullanabilirsiniz.

Keşfedilen her eklentiyi, satır başına bir tane olacak şekilde aşağıdaki biçimde yazdırın:

Plugin: {Name} (v{Version})

Eklentiler şu sırayla yazdırılmalıdır: önce ImageProcessor, ardından DataExporter. HelperUtility sınıfı öznitelikten yoksun olduğu için çıktıda görünmemelidir.

Beklenen çıktı:

Plugin: Image Processor (v1.0)
Plugin: Data Exporter (v2.5)

Bu görev, framework'lerin öznitelikleri işaretleyici olarak ve yansımayı bunları keşfetmek için nasıl kullandığını gösterir - bağımlılık ekleme kapsayıcılarına, serileştirme kitaplıklarına ve test framework'lerine güç veren teknik de aynıdır!

Kendin dene

using System;
using System.Reflection;
using PluginSystem;

class Program
{
    public static void Main(string[] args)
    {
        // TODO: Mevcut assembly'den tüm tipleri al
        // Hint: Assembly.GetExecutingAssembly().GetTypes() kullan
        
        // TODO: Her tipi döngüye al ve PluginAttribute'a sahip olup olmadığını kontrol et
        // Hint: type.GetCustomAttribute<PluginAttribute>() kullan
        
        // TODO: Öznitelik varsa, eklenti bilgisini şu formatta yazdır:
        // Plugin: {Name} (v{Version})
        
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C# derleyicisi