29 Kasım 2011 Salı

C# Reflection Kavramı

Reflection, çalışma zamanında .NET assemblylerini, tiplerini ve tiplerin üyelerini dinamik olarak kullanma fırsatı veren yapıdır. Reflection namespace’i içerisinde bulunan tipler ile üyelere dinamik olarak erişme şansına sahibiz.  Basit bir console uygulaması üzerinden örnek uygulama yapalım.

Öncelikle bilgi alacağımız tipi elde etmemiz gerekmektedir. Bunu 3 farklı yol ile yapabilmemiz mümkündür. Elde ettiğimiz tipi “Type” tipinden bir değişkende tutarız. Adından da belli olduğu gibi Type, tipin tipini tutan bir tiptir Smile   bool tipine dinamik olarak erişerek içerisindeki üyelerin isimlerini öğrenmeye çalışalım.

using System.Reflection;

 

namespace ReflectionKavrami

{

    class Program

    {

        static void Main(string[] args)

        {

            Type tip = typeof(Boolean);

            //Type tip = new Boolean().GetType();

            //Type tip = Type.GetType("System.Boolean");

 

            MemberInfo[] tipUyeleri = tip.GetMembers();

 

            Console.WriteLine("{0} tipi içerisinde {1} adet üye mevcuttur.", tip.Name, tipUyeleri.Length);

 

            int i = 1;

            foreach (MemberInfo member in tipUyeleri)

            {

                Console.WriteLine("{0} - Üye adı : {1} , Üye tipi : {2}", i, member.Name, member.MemberType);

                i++;

            }

        }

    }

}

image

Üyeleri elde etmek için kullandığımız GetMembers metodu, System namespace’I altındaki Type sınıfı içerisinde yer alan non-static bir metottur. Geriye dönüş tipi olan MemberInfo ise System.Reflection namespace’i altında yer alan bir tiptir.

Tüm üyeleri elde etmek yerine, ilgili tipe ait metotları, alanları, property’leri, event’leri, yapıcı metotları da elde etme şansına sahibiz. Type sınıfı içerisinde bu işlemleri yapan ilgili metotlar mevcuttur. Geri dönüş tipleri de System.Reflection isim uzayı altında tanımlı tiplerdir.

Projemize System.Windows.Forms kütüphanesini referans edelim ve Button sınıfı hakkındaki bazı bilgileri ekrana yazdıralım.

class Program

    {

        static void Main(string[] args)

        {

            Type tip = new Button().GetType();

 

            Console.WriteLine("NameSpace : {0}", tip.Namespace);

            Console.WriteLine("FullName : {0}", tip.FullName);

            Console.WriteLine("Assembly : {0}", tip.Assembly.FullName);

            Console.WriteLine("BaseType : {0}", tip.BaseType);

            Console.WriteLine("is Class : {0}\n", tip.IsClass.ToString());

 

            Console.WriteLine("{0} tipi içerisinde tanımlı;", tip.Name);

            Console.WriteLine("\t{0} adet constructor metot,", tip.GetConstructors().Length);

            Console.WriteLine("\t{0} adet property,", tip.GetProperties().Length);

            Console.WriteLine("\t{0} adet metot,", tip.GetMethods().Length);

            Console.WriteLine("\t{0} adet event vardır", tip.GetEvents().Length);

        }

    }

image

Çalışma anında belirlenen bir tipin nesne örneğini oluşturmak isteyelim. Kullanıcıdan bir tip adı girmesini isteyelim ve bu tipten bir nesne örnekleyelim.

class Program

    {

        static void Main(string[] args)

        {           

            Console.WriteLine("Lütfen bir tip adı giriniz");

            string tipAdi = Console.ReadLine();

 

            Type tip = Type.GetType(tipAdi);

            object obj = Activator.CreateInstance(tip);

 

            Console.WriteLine(obj == null ? "Nesne oluşturulamadı." : "Nesne dinamik olarak örneklendi");

        }

    }

image

image

Son örneğimizde de .net framework içerisinde yer alan bir assembly’I elde edelim ve içerisindeki namespace’lere göre gruplama yapalım. Daha sonra da her bir namespace altındaki toplam tip sayısını ve bu tiplerin adlarını ekrana yazdıralım.

class Program

    {

        static void Main(string[] args)

        {

            Assembly assembly = Assembly.LoadFile(@"C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll");

 

            foreach (var group in assembly.GetTypes().GroupBy(t => t.Namespace))

            {

                Console.WriteLine("{0}({1})", group.Key, group.Count().ToString());

 

                Console.WriteLine("*****************************");

 

                foreach (Type tip in group)

                {

                    Console.WriteLine(tip.Name);

                }

                Console.WriteLine();

            }

        }

    }

image

Çalışma anında tipler hakkında nasıl bilgi alınacağından kısaca bahsetmiş olduk. Faydalı olması dileği ile…



0 yorum:

Yorum Gönder