by

C#’ta Reflection

Program yazarken çoğu zaman Ctrl+Space kombinasyonu ile kullandığımız methodların dönüş değerlerine, aldıkları parametrelere , parametrelerin tipine vs gibi özelliklerine bakarız. Çoğu IDE sayesinde bunlara da erişmiş oluruz. Bu noktada birkaç senaryo üzerinden devam edelim.

1. Senaryo ) Bir sınıfın içindeki methodlara ait bilgilerin edinilmesi. (klasik senaryo)
2. Senaryo ) Başka birisinin yazmış olduğu bir sınıf var. Normal koşullarda o kod dosyasını açmadan “private”  , “protected” tipinde olan methodların , niteliklerin isimlerini öğrenemezsiniz. Bu durumda da yardıma koşuyor.
3. Senaryo ) Basit olarak JavaDOC benzeri bir aracı C# için yazmak istediniz. Burada da yorum methodlardan , niteliklerden önce yorum satırlarını okuyup onlara ayrıştırmak yerine Reflection sayesinde basit olarak buna benzer bir araç geliştirebilirsiniz.
*** 4. Senaryo ) Bayağı bir zamandır merak ettiğim ve yeni öğrendiğim birşey. İsmini bilmediğimiz bir methodun ismini çalışma zamanında öğrendik fakat biz bu methodu çalışma zamanında çağırabilir miyiz? Yani demek istediğim yaz() diye bir method var ve biz bu methodun ismini kodu yazarken bilmiyoruz ama çalışma zamanında çağırmak istiyoruz.

Bu kadar senaryodan sonra basit olarak ismini bildiğimiz bir sınıfın methodlarına ait bilgileri nasıl ediniriz diyerek kod kısmına geçelim.

Type intType = Type.GetType(“System.Int32”); foreach (MethodInfo mInfo in intType.GetMethods()) { Console.WriteLine(“————————————“); //Methodun ismi Console.WriteLine(mInfo .Name + ” “); int counter = 0; foreach (ParameterInfo pInfo in mInfo .GetParameters()) { //Methodun aldığı parametrelerin tipleri Console.WriteLine(counter + “. param tipi= ” + pInfo.ParameterType + ” “); counter++; } //Donus değerinin tipi Console.WriteLine(mInfo .ReturnType); Console.WriteLine(“————————————“); }

Yukarıdaki kod ile erişim belirleyicisi(access modifier) ne olursa olsun tüm methodlara dair bilgileri edinmek istersek GetParameters() methoduna parametre olarak BindingFlags’ler vermemiz gerekir. “BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static” şeklinde parametre verirsek tüm methodlara ait bilgilere erişebiliriz.

Geldik bana göre en can alıcı kısma. Şimdi de ismini çalışma zamanında öğrendiğimiz bir methodun yine çalışma zamanında nasıl çağrılacağını gösteren basit bir kod parçasını inceleyelim. Bu kod parçasında sınıfın ilk methodunu çağırıyorum. Buna göre kodun çıktı olarak “deneme123” vermesi gerekiyor. Gerçekten de kodu çalıştırdığımız zaman beklediğimiz sonucu ekranda görüyoruz.

class Boxer { public void test() { Console.WriteLine(“deneme123”); } }

Type unknownBoxer = typeof(Boxer); unknownBoxer.GetMethods()[0].Invoke(new Boxer() , null);