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); // JohnMetotları 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.
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:PluginAttributead alanındaPluginSystemadlı özel bir öznitelik oluşturun. Özniteliğiniz:Attribute'dan türemeli- Salt okunur iki özelliğe sahip olmalı:
Name(string) veVersion(string) - Her iki değeri de oluşturucusu aracılığıyla kabul etmeli
Plugins.cs:PluginSystemad alanında birkaç eklenti sınıfı oluşturun. BazılarıPluginAttributeile 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)
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
PluginAttributeolup olmadığını denetleyin - Özniteliğin
NameveVersionö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})
}
}
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
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi