Nedir?

C#’da Reflection, derleme anında (compile time) türlere ve onların üyelerine (method, property, event vb.) dinamik olarak erişim sağlamaya yarar. Bu yöntem, özellikle derleme anında türlerin ve özelliklerin tam olarak bilinmediği durumlarda oldukça faydalıdır.

Reflection Neden Kullanılır?

Reflection, aşağıdaki durumlarda yaygın olarak kullanılır:

  • Dinamik tip keşfi: Bir nesnenin tipini ya da içerdiği metodları compile time anında öğrenmek.
  • Veri erişimi: Bir sınıfın sahip olduğu metodlar, özellikler ve diğer elemanlar hakkında bilgi edinmek.
  • Dinamik Metot Çağrımı: Metodlara dinamik olarak parametreler ile ulaşmak ve çalıştırmak.
  • Attribute Yönetimi: Özelleştirilmiş öznitelikleri (Attributes) incelemek ve kullanmak.

Kütüphanedeki Temel Sınıflar

  • Assembly: Bir derlemenin (assembly) versiyonu, adı, türü ve diğer verileri hakkında bilgi sağlar.
  • Type: Bir nesnenin ya da sınıfın türüyle ilgili bilgileri barındırır. Bir nesnenin metotlarına, özelliklerine veya alanlarına erişmek için kullanılır.
  • MethodInfo: Bir sınıfın metodları hakkında bilgi sağlar. Dinamik olarak metodları çağırmak için kullanılır.
  • PropertyInfo: Bir sınıfın özellikleri hakkında bilgi sağlar. Çalışma zamanında özelliklerin değerini alıp değiştirmek için kullanılır.

Örnek Kullanımlar

Assembly

using System.Reflection;

Assembly assembly = Assembly.GetExecutingAssembly();

var name = assembly.GetName().Name;//Projenin adını verir.
var version = assembly.GetName().Version;//Projenin versiyon bilgisini verir.
var location = assembly.Location;//Projenin diskteki derlendiği konumun dosya yolunu verir.
var entryPoint = assembly.EntryPoint;//Proje başladığında ilk çalıştırılması hedeflenen metodu verir.
string text = $@"
    {name}
    {version}
    {location}
    {entryPoint}
";

Console.Write(text);

Console.ReadKey();

Çıktısı

Type

class Ogrenciler
{
    public string OgrenciAdi { get; set; }
    public int Notu { get; set; }
}

class Program
{
    static void Main()
    {
        Type type = typeof(Ogrenciler);

        Console.WriteLine("Class Name: " + type.Name);//Verilen Type Object'inin ismini verir

        var properties = type.GetProperties();//Object'in içindeki property isimlerini verir
        foreach (var property in properties)
        {
            Console.WriteLine("Property Name: " + property.Name);
        }

        Console.ReadKey();
    }
}

Çıktısı

MethodInfo

using System.Reflection;

class Matematik
{
    public int Topla(int sayi1, int sayi2)
    {
        return sayi1 + sayi2;
    }
}

class Program
{
    static void Main()
    {
        Type type = typeof(Matematik);
        
        MethodInfo method = type.GetMethod("Topla"); //Class içinden isimle istenilen metod alınır

        object obj = Activator.CreateInstance(type); //Matematik nesnesi oluşturulur

        var toplam = method.Invoke(obj, new object[] { 5, 6 });//Matematik nesnesi içindeki Topla metodu çağırılır, içindeki parametreler sırayla verilerek.

        Console.WriteLine("Toplam => " + toplam);

        Console.ReadKey();
    }
}

Çıktısı

PropertyInfo

using System.Reflection;

class Personel
{
    public string Email { get; set; }
    public string Telefon { get; set; }
}

class Program
{
    static void Main()
    {
        //Personel Nesnesi oluştur
        Personel personel = new Personel();

        personel.Telefon = "5555555555";
        personel.Email = "omerkurgun@hotmail.com";

        Console.WriteLine("Eski = " + personel.Telefon + " " + personel.Email);//Önceki Değer

        //Personel tipini al
        Type personelType = typeof(Personel);

        //Personel sınıfının Email özelliğini al
        PropertyInfo emailProperty = personelType.GetProperty("Email");

        //Değer ataması yap
        emailProperty.SetValue(personel, "info@omerkurgun.com");

        Console.WriteLine("Yeni = " + personel.Telefon + " " + personel.Email);//Yeni Değer

        //İstediğin değeri property ile çek
        PropertyInfo telefonProperty = personelType.GetProperty("Telefon");
        Console.WriteLine(telefonProperty.GetValue(personel));

        Console.ReadKey();
    }
}

Çıktısı

Bazı Kullanım Senaryoları

  • Dinamik Modül Yükleme: Uygulama çalışırken yeni işlevsellikler kazandırmak için modüllerin ya da bileşenlerin compile time’da yüklenmesi için kullanılır.
  • Veritabanı ile Nesne Haritalama (ORM): Database’den çekilen veriler ile C# sınıflarını otomatik olarak eşleştirip, sorgu sonuçlarını dinamik olarak nesnelere dönüştürmek için kullanılır.
  • Test Otomasyonu: Test süreçlerinde metotların dinamik olarak çağrılması ve sahte (mock) nesnelerin oluşturulması için tercih edilir.

Özet

C# System.Reflection kütüphanesi, dinamik programlama ve uygulama performansı açısından büyük bir esneklik sunar. Bu kütüphane sayesinde, türler hakkında bilgi edinmek, metodları ve özellikleri çağırmak ve daha birçok gelişmiş işlem gerçekleştirmek mümkün hale gelir.

Okuduğunuz için teşekkürler, İyi kodlamalar 😉

Kategoriler:

C#,