Bir Class İçerisindeki Methodları Dinamik Olarak Çağırmak (Reflection – Invoke İşlemi)
Bir Class İçerisindeki Methodları Dinamik Olarak Çağırmak (Reflection – Invoke İşlemi)
Bir class içerisinde bulunan bir methodu veya o class içerisindeki tüm methodları duruma göre dinamik olarak çağırmak isteyebiliriz. Bu işlem için birçok farklı yol izleyebiliriz.
Örneğimizde elimizde methodlarımızın bulunduğu bir Functions.cs classımımız var. İçeriği toplam 5 methoddan oluşuyor ve bu methodlar içerisindeki string ifadeleri geriye döndürecek yapıdadır. UI (kullanıcı arayüzü) tarafında ise bu methodlardan dönen değerleri bir listbox içerisinde yazdıracağız.
Öncelik olarak Function.cs dosyamı oluşturuyorum ve içerisine rastgele methodlarımı yazıyorum;
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
class Functions
{
public string Function1()
{
return “Function1”;
}
public string Function2()
{
return “Function2”;
}
public string Function3()
{
return “Function3”;
}
Öncelik olarak hangi class üzerinden dinamik olarak ulaşmak istiyorsak bulunduğumuz class içerisine System.Reflection kütüphanesini çağırmamız gerekiyor.
1using System.Reflection;
Kütüphanemizi ekledikten sonra methodlardan dönen verileri tek tek listbox’a ekleyeceğiz.
01// Methodlarımız hangi class’ın içerisindeyse kullanacağımız class’ın instance’ını alarak ram üzerinde oluşturuyoruz.02Functions fn = new Functions();03 04// Functions class’ı içerisindeki tüm methodlara ulaşıp MethodInfo tipinde dizi olarak tutuyoruz.05MethodInfo[] methods = typeof(Functions).GetMethods();06 07// Methodları çalıştırabilmek için tüm methodların içerisinde (method dizimizde) foreach ile dönüyoruz.08foreach (MethodInfo item in methods)09{10// Kullanmak istediğimiz methodlar “Function” ile başladığından filtreleme işlemi uyguluyoruz.11if(item.Name.Contains(“Function”))12listBox1.Items.Add(item.Invoke(fn, null) as string); // Invoke kullanarak ilgili methodu dinamik olarak çalıştırıyoruz.13}
Eğer sadece belirli bir methodu çalıştırmak istiyorsanız Contains methodu yerine direk name’i (adı) eşit olacak şekilde düzenleyebilirsiniz. Methodunuz parametre alıyorsa yukarıda null yazdığımız alanda parametreleri gönderebilirsiniz. Parametreleri object dizisi olarak göndermeniz gerekmektedir.
Örneğin methodumuz 2 tane string tipinde değişken alıyor diyelim. Bunun için yukarıda ki null alanına aşağıdaki gibi yazmanız gerekmekte;1new object[] {“Buraya 1. parametre gelecektir”, “Buraya 2. parametre gelecektir.”}