C# - Függvény hívása név alapján

forráskód letöltése
Mellékelt példában egy olyan függvényt készítünk, melynek paraméterként meg lehet adni, hogy melyik objektum, mely függvényét hívja meg. Az objektumot Object-ként, a meghívandó függvény nevét pedig sztringként adhatjuk meg.
A megoldás viszonylag egyszerű, csak tudnunk kell, hol keressük a megoldást. Ez a megoldás pedig a Type osztály InvokeMember függvényében rejlik. Ez a függvény képes arra, hogy egy adott típus bármely tagját elérje és kezelje azt. Így nem csak függvények hívását oldhatnánk meg ennek segítségével, de akár egy property értékét is olvashatjuk, írhatjuk.
A célul kitűzött függvényünk a DoInvoke névre hallgat. Első paraméterében kell majd megadnunk azt az objektumot, melyet manipulálni szeretnénk. A második paraméter pedig egy sztring lesz, mely annak a függvénynek a nevét kell hogy tartalmazza, amit szeretnénk meghívni. Jelen megoldásunkban ez csak olyan függvény lehet, melynek nincs paramétere, de az InvokeMember függvény paraméterezett függvény hívást is lehetővé tud tenni.
Első lépésként meg kell határoznunk a kapott objektum típusát. Ehhez a GetType függvényt kell meghívnunk, mely egy Type típusú osztályt ad vissza, melyben ott található az InvokeMember függvény. Ennél első paraméterként a használandó függvény, property, stb. nevét kell megadnunk sztringként. Második paraméterben a használat módjára utaló konstansok átadása történik. Az ezt követő paraméterre most nem lesz szükségünk, míg a negyedik paraméterben az adott objektumot is meg kell adnunk, végül az utolsó paramétert most szintén nem használjuk, itt adhatnánk meg paramétereket, ha olyan függvényt hívunk mely azt is igényli.
      private void DoInvoke(Object obj, string function)
      {
        obj.GetType().InvokeMember(function, BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, new object [] {}); 
      }
A függvényünk aktivizálásához néhány nyomógombot helyeztünk el a Form-on. Ezeknek a szövegét, vagyis Text property-nk értékét úgy állítottuk be, hogy az tartalmazza a meghívandó függvény nevét. Így a gombok Click eseményéhez elég volt egyetlen eseménykezelő függvényt létrehoznunk.
      protected void button1_Click (object sender, System.EventArgs e)
      {
        DoInvoke(textBox1, (sender as Button).Text);
      }
Fenti módszer, mondjuk a Clear gomb esetén az alábbi hívással egyenértékű.
      protected void button1_Click (object sender, System.EventArgs e)
      {
        DoInvoke(textBox1, ”Clear”);
      }