C# Reflection nedir,nasıl kullanılır? -Giriş

Reflection,programın çalışma anında Assemblyler'e(.dll) ait Metadatalar'dan faydalanarak o kendilerine ait değişkenleri, methodları, classları ve bunların tiplerini bulabilme yeteneğidir diyerek özetleyebiliriz. Bir program reflection yardımıyla kullanıcıyı bilgilendirmek yada kendi davranışı üzerinde değişiklik yapmak istediğinde Assembly'e ait Metadata'yı ayıklar ve bu Metadatalar'ı kullanır.  

C# üzerinde reflection kullanarak nesnelerin, methodların ayrıntılarına bakabilir ve çalışma zamanında yeni nesne oluşturarak,methodları çağırabiliriz. System.Reflection kütüphanesini proje içine dahil ederek sınıflar ve interface'lere ait türleri methodları,değişkenleri ve bunların tipleri üzerinde dinamik olarak oynama yapabiliriz. System.Reflection kütüphanesinin olmazsa olmazlarından adeta referans noktası olarak kullandığımız, bir nesnesin türünü Type türünden bir değişkene aktararak işlem yaptığımız System.Type kütüphanesidir. Bir nesnenin türünü geri dönüş tipi System.Type olan typeof operatörü veya GetType() methoduyla bulabiliriz. Bu iki yöntemle çalışma zamanı esnasında nesneleri tiplerini elde edebiliriz. Bir örnek vermek gerekirse:

namespace ReflectionExample1
{
    class subClass
    {
        public virtual int MultiplyInt(int a, int b)
        {
            int result = a * b;
            return (result);
        }
        public class mainClass
        {
            static void Main(string[] args)
            { //subClass sınıfından bir nesne oluştur
                subClass mObject = new subClass();
                //bu nesneye ait tür bilgilerini getir
                Type mType = mObject.GetType();
                //Type nesnesine ait methodları getir 
                var allmethod = mType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public |
                    BindingFlags.Instance);
                //Methoda gönderilecek nesneyi oluştur
                object[] mParam = new object[] { 2, 10 };
                Console.WriteLine(mType.FullName+ "\n" + "Result=" + allmethod[0].Invoke(mObject, mParam));
                Console.ReadKey();

            }
        }

Ekran çıktısı:

reflectionExample

var allmethod = mType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public |
                    BindingFlags.Instance);

satırında yaptımız işi System.reflection kütüphanesi altında bulunan MethodInfo sınıfından bir nesne oluşturarak da yapabilirdik.GetMethods sınıfının içerisine yazdığım parametreler System.Reflection Sınıfı altında BindingsFlags Enumeration'ın dan erişim belirleyici üyelere göre getirilir. Bu üyelerin açıklaması ise şu şekilde:

DeclaredOnly: Kullanılan türün kendi metotları diziye aktarılır. Kalıtım yoluyla gelenler aktarılmaz.

Public: Public erişim belirleyicisi ile işaretlenmiş metotlar.

Instance: Örnek oluşturulan methodlar getirilir.

Console.WriteLine(mType.FullName+ "\n" + "Result=" + allmethod[0].Invoke(mObject, mParam)); 

Satırında subClass sınıfından oluşturduğumuz nesnenin türünü yazdırdık ve aynı nesneye ait methodlardan allmethod[0] ile temsil edilen(Delegate) metoda mParam nesnesini yollayarak işlem yaptırdık. Burda kullandığımız System.Reflection.MethodBase sınıfına ait bir method olan Invoke() metodu yardımıyla runtime sırasında dinamik olarak metodlarla çalışmak mümkündür. Bu method thread-safe yapıdadır.

Type mType = mObject.GetType(); 

Satırında tanımladığım mType nesnesi subClass'ım hakkında artık yeterince bilgiye sahip.Bu nesne yardımıyla subClass'ım abstract mı yoksa normal tanımlanmış bir sınıf mı şu şekilde öğrenebilirim:

mType.IsAbstract 

ya da:

mType.IsClass 

boolean olarak geri dönüşleri kontrol ederek işlemler yapabiliriz.

0 Yorum

Yorum Yaz