C# - Függvény meghívása az osztály és a függvény neve alapján

forráskód letöltése
Ebben a példában egy olyan megoldást keresünk, melynek segítségével képesek leszünk arra, hogy egy tetszőleges osztály tetszőleges függvényét meghívjuk, ehhez mindössze az osztály megnevezésére, illetve a függvény nevére lesz szükségünk sztringként.
Első lépésként készítsünk egy osztályt Class1 néven, melyben létrehozunk egy függvényt Method1 néven, amely egyszerűen csak megjelenít egy üzenetablakot a képernyőn. Ezt a függvényt fogjuk majd aktiválni.
  public class Class1
  {
    public void Method1()
    {
      MessageBox.Show("Method1");
    }
  }
Készítünk tehát egy függvényt, mely megvalósítja a fent leírt funkciót. Ez lesz az InvokeFunction, melynek első sztring paraméterében az osztály nevét, míg a másodikban a futtatandó függvény nevét kell megadnunk. Első lépésként az osztály név alapján egy Type osztályt kell létrehoznunk, ehhez a GetType függvényt használhatjuk. Ahhoz, hogy ennek az osztálynak egy függvényét elérhessük, szükségünk lesz ennek az osztálynak egy példányára. A létrehozott Type típust felhasználva az Activator osztály CreateInstance függvénye elkészíti ezt.
    private void InvokeFunction(string className, string functionName)
    {
      Type t = Type.GetType(className);
      object obj = System.Activator.CreateInstance(t);
A létrejött objektumnak szintén lekérjük a típusát a GetType függvénnyel, melyet ismét Type osztály típusban kapunk meg. Ez rendelkezik egy InvokeMember függvénnyel, mely képes arra, hogy egy név alapján azonosított függvényt meghívjon. Ezt a nevet kell az első paraméterben átadnunk.
      obj.GetType().InvokeMember(functionName, BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, new object[]{});
    }
Az elkészült InvokeFunction függvényt most már egyszerűen használhatjuk. Csak megadjuk annak az osztálynak és függvénynek a nevét, melyet meg szeretnénk hívni.
    private void button1_Click(object sender, System.EventArgs e)
    {
      InvokeFunction("Activator.Class1", "Method1");
    }