C# string to method

Programovacie jazyky, rady, poradňa...
gm4n
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 307
Registrovaný: 03 jún 2008, 7:06

C# string to method

Príspevok od používateľa gm4n »

Dobry den
Tak dlhsiu dobu stojim na jednom probleme ohladne vyvolania metody ak pozname jej nazov.
Riesenie mozno by sa dalo poriesit aj inym sposobom ale mna zaujima ci je aj nejaka takato moznost :D

Pre prikad mame nasledujucu situaciu
name vytvorene pole kore obsahuje nazvy metod (ah dufam ze som to dobre nazval :( ) na vyvolanie

Kód: Vybrať všetko

string[] Pole = new string[] {" Vyvolaj()","VyvolajMa()"}

private string Vyvolaj()
{
return "Navratena hodnota";
}
private string VyvolajMa()
{
return "Navratena hodnota";
}

a mame cyklus ktory ziskava nazvy z pola
foreach (string aktHodnota in Pole)
{
string x = ?AktHodnota?;
}
otazka je mozno jednoducha je mozne aby za x bola vratena hodnota z jednotlivej metody?
Diky za napady
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C# string to method

Príspevok od používateľa weroro »

V C# nie je niečo ako eval() ?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C# string to method

Príspevok od používateľa BX »

Ak ich nie je veľa, dalo by sa to poriešiť switchom (príp. podmienkami) s porovnávaním stringov, nie?
Teda niečo ako

Kód: Vybrať všetko

private string SuperFunkcia(string s)
{
 if (s=="Vyvolaj") return Vyvolaj();
else if (s == "VyvolajMa") return VyvolajMa()
atď.
}
// Harrison: preto som začal vetou, ktorou som začal ;)
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C# string to method

Príspevok od používateľa harrison314 »

weroro: C# vetcinou nie je interpretovany jazyk, nema eval, C# dokaze skopilovat objektovy model programu a vykonat ho za behu
BX: ak ma trieda milion metod upises sa k smrti
gm4n: pouzi reflexiu a najme do nazvov metod nedavajzatvorky
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: C# string to method

Príspevok od používateľa metthal »

myslim si ze nasledovny priklad staci aby si to pochopil

Kód: Vybrať všetko

using System;
using System.Reflection;
using System.Text;

namespace DynamickeVyvolavanieMetod
{
    class Program
    {

        static void Main(string[] args)
        {
            Program program = new Program();
            string[] Pole = new string[] { "Vyvolaj", "VyvolajMa" };
            foreach (string aktHodnota in Pole)
            {
                String x = (String)program.GetType().InvokeMember(aktHodnota, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, program, null);
                Console.WriteLine(x);
            } 
        }

        private string Vyvolaj()
        {
            return "Navratena hodnota";
        }

        private string VyvolajMa()
        {
            return "Navratena hodnota";
        }
    }
}
PS: ak to budes chciet spravit medzi 2 subormi, kde budu rozdielne triedy, musis ist cez

Kód: Vybrať všetko

Type type = Assembly.Load("NazovProjektu").GetType("DynamickeVyvolavanieMetod.Program");
object objekt = Activator.CreateInstance(type);
a potom to volat z "type" cize

Kód: Vybrať všetko

type.InvokeMethod(...);
a ako instanciu objektu davaj "objekt"
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: C# string to method

Príspevok od používateľa manager666 »

jedno z moznych rieseni:

Kód: Vybrať všetko

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Dictionary<string, Func<string>> funkcie;
        public Form1()
        {
            InitializeComponent();
            funkcie = new Dictionary<string, Func<string>>
                {{"Vyvolaj",delegate(){ return Vyvolaj();}},
                    {"VyvolajMa",delegate(){return VyvolajMa();}}
                };
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (KeyValuePair<string, Func<string>> o in funkcie)
            {
                Func<string> f = o.Value;
                string str = f();
                MessageBox.Show(str);
            }
        }
        private string Vyvolaj()
        {
            return "Vyvolaj";
        }

        public string VyvolajMa()
        {
            return "VyvolajMa";
        }
    }
}
Ak by tie funkcie obsahovali parametre, odporucam pouzit lamba abstrakciu(lamba/anonymne funkcie).
:wink:
gm4n
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 307
Registrovaný: 03 jún 2008, 7:06

Re: C# string to method

Príspevok od používateľa gm4n »

Vdaka za reakcie no problem je ze je toho dost vela asi 50 preto je tam to pole ale ide aj o to ze aby sa to dalo lahko obmienat do buducna no ako premyslam tak zmyslam ale nic ma nejake rozumne nenapada este skusim hladat na inych forach. Neexistuje teda nejaky datovy typ ktpry by sa dal pouzit ako nazov ten metody ? :lol:
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: C# string to method

Príspevok od používateľa metthal »

Ja som ti dal riesenie dynamicky volanych metod pomocou InvokeMethod(...), manager ti poskytol riesenie cez delegatov a dictionary, nic lepsie myslim ze nenajdes...

Co spominal manager, ak sa jedna o metody s parametrom tak pri mojom rieseni ich davas do posledneho parametra v InvokeMethod, staci tam dat new object[] { param1, param2, ... }
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C# string to method

Príspevok od používateľa harrison314 »

gm4n napísal:Vdaka za reakcie no problem je ze je toho dost vela asi 50 preto je tam to pole ale ide aj o to ze aby sa to dalo lahko obmienat do buducna no ako premyslam tak zmyslam ale nic ma nejake rozumne nenapada este skusim hladat na inych forach. Neexistuje teda nejaky datovy typ ktpry by sa dal pouzit ako nazov ten metody ? :lol:
Preto som prave hovoril o reflexii ( nie ze by ju ostatny nevyuzivali ale len volaju metody ),
na tvojom mieste by som najskor vydoloval vsetky metody danej triedy

Kód: Vybrať všetko

MethodInfo[] metody = TvojObjekt.getType()GetMethods();
Potom by som foreach ciklom vsetky prechdazal a volal len tie co splnaju istu podminku ( narikald cast nazvu, parametre , navratova hodnota, viditelnost ). Volat ich budes ako s predchadjucich prikaldoch.
A ked tam prida dalsich 50 metod nemusis menit cast ktora sa satara o reflexiu.
gm4n
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 307
Registrovaný: 03 jún 2008, 7:06

Re: C# string to method

Príspevok od používateľa gm4n »

Ou wolfik vdaka ja som to nejakym nedorozumenim preskocil :shock: ale nasiel som to iste co si poradil ty funguje to Vdaka za pomoc
Napísať odpoveď