Makale Özeti

Dizinin ikinci bölümü olan bu makalede reflection ile ilgili örnek uygulama yapacağız.

Makale

REFLECTION - 2

System.Type

Reflection isim uzayı yönetilen kod tarafında yüklenen nesnelerin türlerini, metodlarını ve alanlarını dinamik olarak oluşturmayı ve türleri çağırmayı sağlayan sınıflar ve arayüzler içerir.

Reflection, System.Type üzerine odaklanmıştır.

Uygulamamızda System.Reflection sınıfını kullanırken, System.Type sınıfı ve buna ek bazı sınıflar, .net uygulamaları içinde ki herbir yapının elemanlarını araştırmamıza olanak sağlar. Bunu sağlarken artı olarak gerek geliştirme aşamasında, gerek derleme aşamasında herhangi bir uğraş gerektirmez.


Şekil-1: Reflection API modeli

Yukarıdaki Reflection API modelinden de gördüğümüz gibi, MemberInfo sınıfı temel fonksiyonları gerçekleştirmemizi sağlayan bir sınıftır. MemberInfo sınıfı, System.Object sınıfından türemiştir. Sınıfın özellikleri, alanları, türleri, olayları yapısı ve metodları hakkında bilgi almamızı sağlar. Mesela, özellik hakkında bilgi edinmek istersek, MemberInfo sınıfından türemiş olan PropertyInfoyu çağırmamız yeterlidir.

Aşağıdaki tabloda System.Type sınıfının desteklediği metodları görüyoruz.

NameSpace

Türün içinde yer aldığı isim uzayınının tam özelliklerini gösteren string dönderir.

GetProperties

Tür için tanımlanan bütün özellikleri gösteren bir dizi olan PropertyInfo nesnesi dönderir.

GetMembers

Türün bütün üyelerini (metodlari, alanlari, özellikleri ve yapilari) gösteren bir dizi olan MemberInfo nesnesi dönderir.

GetInterfaces Türe ile uygulanan bütün bütün interfaceleri gösteren bir dizi olan Tür nesnesi dönderir.
GetFields

Tür için tanımlanan bütün alanları tanimlayan bir dizi olan FieldInfo nesnesi dönderir.

GetEvents

Tür için tanımlanan bütün olayları gösteren bir dizi olan EventInfo nesnesi dönderir.

GetMethods

Tür için tanımlanan bütün metodları gösteren bir dizi MethodInfo nesnesini dönderir.

GetConstructors

Tür için tanımlanan bütün yapıları gösteren bir dizi olan ConstructorInfo nesnesini dönderir.

InvokeMember

Türün ismini ile metod çağırmayı sağlar.

IsClass

Tür bir referans türü veya bir sinifsa true değeri dönderir.

IsValueType

Tür bir değer türüyse true değeri dönderir.

IsArray

Tür bir dizi ise true değeri dönderir.

IsCOMObject

Tür bir COM nesnesi ise true değeri dönderir.

IsInterface

Tür bir interface ise true değeri dönderir.

IsSubclassOf

Bir metoda geçirilen tür, eğer Type nesnesinin alt sınıfı ise true değeri dönderir.

Şekil - 2: System.Type sınıfının desteklediği metodlar.

Reflection ile alakalı herhangi bir işlem System.Type sınıfına erişimle gerçekleşir. System.Type, reflection için çekirdek sınıf rolündedir. Bu sınıf aracılığı ile herhangi bir tür hakkında almak istediğimiz bütün bilgileri elde edebiliriz. Bütün türler, System.Object isim uzayının GetType metodundan türetilmişlerdir. ( GetType metodu; türü tanımlıyıcı bir Type nesnesi dönderir. ) Bu sayede .net içinde her nesne GetType metodunu destekler.

Şimdi bir örnekle devam edelim.

Örneğimizde, üzerinde çalıştığımız formun Assembly özelliklerini, Assembly’nin modüllerinin özelliklerini, modüllerin türlerinin özelliklerini elde edeceğiz.

Form tasarımında, forma bir tane listbox kontrolü ekleyelim ve ismini lstType olarak değiştirelim.

Type sınıfını kullanmak için System isim uzayını dahil ediyoruz.

Imports System

Assembly sınıfını kullanmak için Reflection isim uzayını dahil ediyoruz.

Imports System.Reflection

Kolaylık olması açısından, listeye elde ettiğimiz bilgileri eklettirmek için Yaz adında bir yordam oluşturuyoruz.

Public Sub Yaz(ByVal katar As String)
lstType.Items.Add(katar.ToString)
End Sub

Form yüklendiğinde, geçerli olan assemblyyi elde edmek için Reflection.Assembly sınıfına ait olan GetExecutingAssembly metodunu kullanıyoruz.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim CurrentAssembly As Assembly = [Assembly].GetExecutingAssembly

Elde ettiğimiz assemblynin modüllerini, türlerini elde etmek için aşağıda oluşturacağımız fonksiyonu çağırıyoruz.

AssemblyOzellikleri(CurrentAssembly)
End Sub

Assemblynin özelliklerini elde etmek için AssemblyOzellikleri adında, dışarıdan parametre olarak Assembly türünden bir değişken alan sub tanımlıyoruz.

Private Sub AssemblyOzellikleri(ByVal asm As Assembly)

Dışarıdan gelen assemblynin, bizim örneğimizde geçerli olan assemblynin ismini listboxa ekliyoruz.

Yaz("Assemly ismi: " & asm.ToString)

Dışarıdan gelen assembly içindeki bütün modülleri elde etmek için for döngüsü kuruyoruz.

Dim modul As [Module]
For Each modul In asm.GetModules
Yaz(vbTab & "Modülü: " & modul.ToString)

Bir System.Type sınıfında bir değişken tanımlıyoruz.

Dim tur As System.Type

Modül içindeki bütün türleri elde etmek için for döngüsü kuruyoruz.

For Each tur In modul.GetTypes
Yaz(vbTab & vbTab & "Türü : " & tur.ToString)

MemberInfo türünden bir değişken tanımlıyoruz.

Dim UyeBilgisi As MemberInfo

Türün bütün üyelerini (metodları, alanları, özellikleri ve yapıları)elde etmek için Type sınıfına ait olan GetMembers metodunu çağırıyoruz.

For Each UyeBilgisi In tur.GetMembers
Yaz(vbTab & vbTab & vbTab & "Üye: " & UyeBilgisi.ToString)
Next
Next
Next
End Sub

Örnek olması açısından bulunduğumuz assembly içinde bir kaç değişken tanımlıyoruz.

Public Class AssemblyIcindekiSinif

Public SayiTanimlama As Int16
Private Property OzellikTanimlama()
Get
End Get
Set(ByVal Value)
End Set
End Property

Private Sub MetodTanimlama()
End Sub

End Class

Programımızı çalıştırdığımızda uzun bir listeyle karşılaşırız. Listenin başında assemblynin ismi ve assemblyye ait diğer bilgiler vardır. Listede aşağıya doğru indiğimizde metodları, türleri, özellikleri görürüz. Listeye dikkatle baktığımızda, bizim örnek olsun diye tanımladığımız değişkenleri görebiliriz.


Şekil - 3: Program çıktısı.

Gördüğümüz gibi System.Type sınıfı; arayüzler, diziler, sınıflar, değerler, numaralandırmalar ve bunun gibi bir çok nesne hakkında bilgi edinmemize yardımcı olan bir sınıftır.

Çekirdek sınıf olma özelliği vardır demiştik.Yine d

iyebiliriz ki ; Reflection = System.Type + GetType().

Öznur KARAKUŞOĞLU
oznurkarakusoglu@hotmail.com