Reflection Kullanımı
Husamettin Elalmis
Merhaba arkadaşlar, bu yazıda sizlere System.Reflection isim uzayı altında bulunan Reflection konusundan bahsedeceğim, bu konu hem uzun hem çok yere giden bir konu, dolayısıyla ana hatlarıyla bu makalede bahsediyor olacağım.
Reflection nedir?
Bir objenin içerisini okuma işine Reflection denir.
Objenin tipi
Objenin içerisinde tanımlanan Propertyler
Objenin içerisinde tanımlanan Methodlar
Objenin contructor tanımı
Tüm methodların parametreleri ve tipleri
Bir objenin içerisini okumak için önce o objenin tipini öğreniriz
typeof(obj) veya obj.GetType() komutları kullanılır.
Bilinmesi Gereken Kavramlar
Reflection kavramına geçmeden önce aşağıdaki kavramların biliniyor olması gerekmektedir. Bu kavramlar çerçevesinde Reflection kullanımı çok etkin ve başarılı sonuçlar vermektedir.
NameSpace (isim uzayı)
Framework seviyesinde gruplandırılmış isim alanları (Framework)
System
System.IO
System.Data
…
Assembly
Exe veya dll
.Net framework ile build edilmiş kütüphane veya uygulama
Object
Class
Interface
Enumeration
...
GAC (Global Assembly Cache)
Sabit tanımlı NameSpace'ler windows işletim sisteminde GAC olarak isimlendirilerek ortak system klasöründe barındırılır
Projeye eklenen referanslar buradan okunabilir, heryerden erişimi vardır
Kendi yazdığımız bir dll kütüphanesini GAC'a tanımlayabiliriz, böylece tüm projelerde AddReference yaparken otomatik kullanıma açık olur.
Property (özellik)
Bir classın içerisinde yaşayan değişkenlere verilen isimdir. Getter, Setter özellikleri vardır.
Generic & Dinamik & Static
Generic: Tipi değişebilen demek
Generic Tip: Tipi belli olmayan, istenildiğinde tipi belli olan.
Generic Method: Tipi belli olmayan, her türlü tipi parametre olarak alabilen Method demek.
Generic Class: Tipi belli olmayan, içerisine o an belirlenen bir tip gönderilen demek.
Örnek: Listemde bir obje listesi olsun. Bu objelerimin tipi henüz belli değildir. Ben bu tipi setlediğimde tipi belli olsun. List à List<string>
T kullanımı, Type anlamına gelir. Generic kodlama yaparken sıkça kullanırız.
Dinamik: Barındırdığı eleman sayısı değişebilen demek
Dinamik Liste: Listeye her an yeni elemanlar katılabilir, ayrılabilir demek.
Örnek: Benim bir menu listem var, dinamik. Menüye istediğimiz zaman eleman ekleyebilir veya çıkartabiliriz.
Static: Sabit değer demek
Static değişken: Değeri uygulamanın başından sonuna kadar sabit olan, değişmeyen değer demek.
const string = "Test"
Static class: Classın instance'ı bir defaya mahsus oluşturulan ve yaşayan demek.
Static liste: İçerisindeki eleman sayısı sabit, hiç bir zaman değişmeyen, eklenmeyen, silinmeyen liste demek.
Nerelerde Kullanılır? Önemi nedir?
Çok amaçlı senaryolarda kullanılır
Generic yapılarda kullanılır, olmazsa olmazlardandır.
Mapping işlemlerinde kullanılır
Bir objeyi, bir diğer objeye map etme işlemini otomatik yaptırma amaçlı kullanılır.
Raporlama araçlarında kullanılır
Objenin tipi generic olan yapılarda, çok amaçlı raporlama araçlarında kullanılır. Reflection dışında herhangi bir muadili yoktur.
ADOQuerylerinde kullanılır
Yazılan SQL querylerinin obje listesine map edilmesi işlemlerinde kullanılır
Bu işi EntityFramework bizim yerimize otomatik olarak yapmaktadır. ADO.Net projelerinde mapping işlemini el ile yapmak meşakkatli ve zahmetlidir. Kod değişikliklerinde sıkça cebelleşilir. Bu yüzden Reflection yöntemleri ile otomatik map işlemlerinde kullanılır. (3th uygulamalar kullanılmaz ise, AutoMapper vb.)
Farklı veri formatlarının birbiriyle eşleştirme işlemlerinde kullanılır
Jsondan gelen bir datanın xml deki bir data ile eşleştirilmesi işlemlerinde kullanılabilir, vb.
Dbden gelen bir datanın bir obje ile eşleştirilmesi işlemlerinde kullanılabilir, vb.
Bir tipin, tüm methodlarının listelenmesinde parametrelerinin okunmasında kullanılır
Invoke komutu, generic tiplerde method imzasına uygun yapıda parametre gönderilmesini sağlar. Bu, generic yapılarda çok kullanışlı bir araç haline dönüşmektedir. Test Automation araçları bu temel ile yazılırlar.
Bir tipin, bir instance'inin new'lenerek oluşturulmasını sağlar
Activator.CreateInstance komutu, generic tiplerde, ilgili objenin bir kopyasını oluşturarak ram'e yükler. Çok amaçlı kullanımı vardır, bir çok senaryoyu çözümler.
Bir tipin, propertylerine otomatik olarak veri setlenmesini sağlar.
Bir tipin şablonu okutularak, istenilen sayıda obje türetilebilir ve başlangıç değerleri otomatik olarak setlenebilir. Generator araçları, AutomationTest araçları, DB araçları bu temel mantığa göre çalışır.
Bir exe veya dll dosyasının method ve parametre analizi yapılabilir (ReverseEngineering)
.NetFramework uygulamaları obsufcator(karıştırma) kullanılmamış ise tüm kod ve methodları görülebilir.
Örnek 01 – Objeye Reflection Uygulayalım
Objenin ne olduğu önemsizdir
Reflection komutları ile objenin içini tarayabiliyoruz
Nerde işime yarar?
Ogrenci classını bir methoda gönderip, property değerlerine göre ve value değerlerine göre Rapor hazırlamak istersem işime yarar.
Ogrenci classı olmak zorunda değil, herhangi bir class da olabilir. Senaryoya göre class gönderebiliriz.
Generator yazmak istersem işime yarar, şekilden şekile sokabiliriz.
Örnek 02 – Dümdüz Activator.CreateInstance Kullanalım
Ogrenci classından 1 adet instance oluşturarak AdSoyad'ına setleme işlemi yaptık.
Burada anahtar kelime Activator.CreateInstance(t)'dir.
Bu işlemi tabi ki Ogrenci obj = new Ogrenci(); diyerek yapabilirdik ama bu şekilde yazarsak generic olmaz, static olur. Bir sonraki örnekte bunu generic yapıya dönüştüreceğiz, o zaman kullanımı daha net ortaya çıkacak.
Örnek 03 – Generic Activator.CreateInstance Kullanalım
Test05 methodu, generic bir method oldu.
Bu methoda hangi objeyi, hangi propertyi gönderirsek ona setleme işlemi yapacak.
Generic tipleri kullanmanın en büyük avantajı budur, tip her zaman değişebilir!
Örnek 04 – String tipinin methodları nelerdir? Görelim
private static void Test06()
{
Console.WriteLine($”== method listesi ==”);
List<string> list = typeof(string).GetMethods().Select(x => x.Name).Distinct().OrderBy(x => x).ToList();
foreach (var item in list)
{
Console.WriteLine(item);
}
}
String bir tipe uygulanabilecek methodları framework seviyesinde görebiliyoruz
Buradan hareketle, tüm NameSpace'ler altındaki tüm methodları listeleyebiliriz
Bu methodlar, XML dokumantasyonları ile entegre olduğu için methodların ne işe yaradıkları ve parametre listelerini de alt alta yazdırabiliriz. Tüm framework hizmetimizde.
Örnek 05 – Generic tipe göre methodları görelim?
İstediğimiz tipin methodlarını görebiliriz
Örnek 06 – SessionLimit.exe Assembly Çağıralım?
Assembly içerisindeki tüm methodları ve parametreleri görebiliriz
Örnek 07 – SessionLimit.exe Derinliklere İnelim
Exe veya dll dosyalarının içerisinde bulunan static stringler görülebilmektedir.
Buradan hareketle, URL adresini kurcalayan birisi sunucu URL üzerine PostAttack yapmayı deneyebilir.
Bunlar, genellikle penetrasyon testlerinde ortaya çıkarılır
Örnek 08 – Sabit Değerler Yakalanır
Sabit değerler genellikle yakalanır
Bunlar genellikle sızma testlerinde ortaya çıkarılır
Dll'lerin içeriği okunabildiği için sabit değerlerden kaçınmakta fayda vardır
Önemli bilgi ifşaları sisteme sızılmasına yol açabilir
Ekler
Bu makale ile birlikte Reflection kullanılarak oluşturulmuş 2 adet text dosyası eklenmiştir
assemblyList.txt (tüm namespace altındaki tüm methodların isimleri ve dönüş tipleri listelenmiştir, referans amaçlı kullanılabilir)
efMethodList.txt (tüm ef methodlarına ilişkin XML documanı eşleştirilerek oluşturulmuştur, referans amaçlı kullanılabilir)
assemblyList.txt
efMethodList.txt
Sonuç
Reflection, genellikle backend tarafında framework hazırlama işlemlerinde ağırlıklı olarak kullanılmaktadır
Generic yapılarla birlikte kullanımı çok etkilidir
Saygılarımla,
Hüsamettin ELALMIŞ – 11.07.2021
husamettin.elalmis@arksoft.com.tr
Last updated