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 😉