Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    leggere il contenuto di una variabile il cui nome è memorizzato in una stringa

    Ciao a tutti, ho la funzione generica
    codice:
    public void miaFunzione(Classe1 temp1, Classe2 temp2, ...)
    Ho bisogno di passare ad una funzione, il nome della classe a cui appartiene il metodo, il nome del metodo, il nome dei parametri e il loro contenuto.
    Il nome della classe lo ottengo con: this.GetType().Name
    Il nome del metodo lo ottengo con: MethodBase.GetCurrentMethod().Name
    I nomi dei parametri li ottengo con: MethodBase.GetCurrentMethod().GetParameters()[indice].Name
    Il mio problema è che non riesco a riferire i parametri in input della funzione partendo dalla stringa che contiene il nome del parametro stesso, ossia cerco un modo per poter scrivere
    string nome = MethodBase.GetCurrentMethod().GetParameters()[indice].Name;
    object temp = riferisciDaNome(nome);
    in modo da avere il parametro nell'oggetto temp.
    Speravo si ci arrivasse in qualche modo da l'oggetto ParameterInfo ma non ci sono riuscito.
    Grazie in anticipo per l'aiuto.

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Dovresti studiarti il NameSpace System.Reflection:
    http://www.codeproject.com/Articles/...lection-in-NET

    Oppure:
    http://www.aspitalia.com/articoli/as...eflection.aspx (piu' chiaro)

    E' piu' facile di cio' che sembra.

  3. #3
    Grazie del consiglio, e infatti speravo di trovare la soluzione nella reflection, ma il problema, per quello che ho visto fino ad ora, è che per usare la reflection, devo comunque partire da un oggetto.
    Ossia, se ho la variabile Temp, senza sapere nessun'altra informazione, posso tirar fuori il tipo, tutti i suoi parametri e il loro contenuto... ma io non ho la variabile Temp, al massimo ho una variabile di tipo stringa che contiene la parola "Temp".

    Grazie ancora

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Si passa comunque per la reflection. Non l'ho mai fatto, ma so che si puo' fare.

    Nel primo articolo c'e' il seguente codice:
    codice:
     Assembly objAssembly; 
     objAssembly = Assembly.GetExecutingAssembly(); 
    
     Type classType = objAssembly.GetType("stringa");
     object  obj  =  Activator.CreateInstance(classType);
    Leggi comunque questo thread su StackOverflow:
    http://stackoverflow.com/questions/2...ce-from-string

  5. #5
    OK mea culpa, nello scrivere il post ho fatto un casino a partire dal titolo fino alle risposte, quindi ricomincio da capo.

    Il titolo e la domanda del post dovevano essere:
    leggere il contenuto di una variabile il cui nome è memorizzato in una stringa
    ossia, se all'interno della mia procedura ho la seguente dichiarazione
    codice:
    ClasseGenerica miaVariabile = new ClasseGenerica ()
    vorrei poter scrivere più avanti nella mia procedura qualcosa del tipo
    codice:
    object variabileDaNome = restituisciVariabileDaNome("miaVariabile")
    in modo che dentro variabileDaNome abbia una copia di miaVariabile.

  6. #6
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao,
    ma perchè devi fare tutto ciò se si tratta della stessa procedura? perchè non chiami direttamente miaVariabile?

  7. #7
    Ovviamente hai ragione, ma ho estrapolato e semplificato il concetto da un problema più ampio.
    In realtà mi serve scrivere delle righe di codice da copiare così per come sono in tutte le funzioni in cui ne ho bisogno, righe di codice, che devono richiamare una funzione a cui devono passare: il nome della classe di cui fa parte il metodo che sto eseguendo, il nome del metodo, e tutti i parametri passati al metodo. Sono riuscito ad ottenere tutte le informazioni che mi servono, anche l'elenco dei parametri passati con nome e tipo come oggetti ParameterInfo, ma da questi, non sono riuscito a riferire l'oggetto passato come parametro e il suo contenuto.
    Nel primo post puoi leggere a cosa ero arrivato

  8. #8
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    boh, forse continuo a non capire, ma non ti basterebbe fare una cosa del genere :

    codice:
    Dictionary<string, object> listaVariabili = new Dictionary<string, object>();
    
    ...
    listaVariabili.Add("miaVariabile",new ClasseGenerica());
    
    ...
    object variabileDaNome = listaVariabili["miaVariabile"];
    magari dicci direttamente il tuo scenario, magari con il codice...

  9. #9
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Buongiorno,
    perdonami, credo di aver capito cosa volevi fare solo ora...

    in pratica, correggimi se sbaglio, vorresti estendere alcuni metodi con del codice che fa una determinata cosa, e per non stare a modificare il tutto vorresti fare un codice standard che va bene senza modifiche in ogni metodo nella quale posizionerai il codice, senza preoccuparti di modificarlo in base a i parametri passati, è corretto adesso?

    se ho compreso bene il concetto purtroppo ti devo dare una cattiva notizia : non si può fare con la reflection. Perlomeno non in maniera semplice, credo che potresti andare a cercare i valori all'interno dello stack, ma io onestamente lo sconsiglio vivamente, anche perchè con una eventuale modifica rischieresti di fare davvero un casino.

    In realtà potresti fare una cosa che a mio parere potrebbe essere anche più elegante come soluzione, ovvero l'uso degli Extension Method in questo modo :

    codice:
    namespace ExtensionMethods
    {
        class Program
        {
            static void Main(string[] args)
            {
                Class1 c1 = new Class1();
                dynamic test = c1.MyCodeExtension("Method1", "parameter Value", 1);
                Console.WriteLine(test);
                test = c1.MyCodeExtension("Method2", 1, 1);
                Console.WriteLine(string.Format("result = {0}", test));
                //void
                c1.MyCodeExtension("Method3");
                //chiamato con metodo tradizionale non aggiunge +1 a intParameter
                test = c1.Method2(1,1);
                Console.WriteLine(string.Format("result = {0}", test));            
             }
         }
    
        public class Class1
        {
            public string Method1(string stringParameter, int intParameter)
            {
                return string.Format("type : {2}. this is stringParameter : {0} and this is intParameter : {1}", stringParameter, intParameter, this.GetType().Name);
            }
    
            public int Method2(int stringParameter, int intParameter)
            {
                return stringParameter + intParameter;
            }
    
            public void Method3() 
            {
                Console.WriteLine("in Method3");
            }
        }
    
        public static class Extension
        {
            public static dynamic MyCodeExtension<T>(this T obj, string Method, params object[] Parameters)
            {
                int i=0;
                MethodInfo mi = typeof(T).GetMethod(Method);
                if (Parameters.Length > 0)
                {
                    Dictionary<string, dynamic> parameterObjList = new Dictionary<string, dynamic>();
                    ParameterInfo[] pInfo = mi.GetParameters();
                    pInfo.OrderBy(o => o.Position).ToList()
                        .ForEach(f =>
                            parameterObjList.Add(f.Name, Parameters[i++])
                            );
    
                    //Qui inserisci il codice di estensione. 
                    //Ad esempio sotto richiamo il parametro con il nome da una stringa elo stampo a video
                    Console.WriteLine(parameterObjList["stringParameter"]);
    
                    //qui invece modifico il valore passato al metodo in modo 
                    //che agginga +1 al parametro numerico prima di passarlo al metodo reale
                    parameterObjList["intParameter"]++;
    
                    Parameters = parameterObjList.Values.ToArray();
                }
                //restituisci il valore del metodo tradizionale e passi i parametri
                //eventualmente modificati
                return mi.Invoke(obj, Parameters);
            }
        }
    }
    in questo modo non dovrai includere il codice in ogni metodo, ti basterà aggiungerlo solo nel metodo di estensione nella classe statica (Extension) e dovrai solo chiamare il metodo in modo un po diverso, ovvero anzichè così :

    codice:
    Class1 c1 = new Class1();
    c1.Method1("parameter Value", 1);
    lo farai così :

    codice:
    Class1 c1 = new Class1();
    c1.MyCodeExtension("Method1", "parameter Value", 1);
    ma potrai ancora chiamarlo in modo tradizionale (non eseguirà il codice aggiuntivo) e chiamerai in questo modo solo i metodi nella quale ti serve (in qualsiasi metodo di qualsiasi classe tu voglia senza aggiungere codice) il codice aggiuntivo e solo se in quel momento ti serve.

    Spero di aver capito bene stavolta


  10. #10
    Grazie U235, hai capito la questione, e in larghe linee ho capito la soluzione che mi hai proposto, ora sto provando ad eseguirla ma mi da errore sulla parola chiave dynamic.
    Dice che non la conosce o che mi manca una direttiva using ma non me la consiglia :'(.

    Anche se questa soluzione è più elegante, sarei interessato anche a quella che dici tu, tramite lo stack, per due motivi, il primo è che non mi tocca andare a modificare tutte le chiamate di funzioni, il secondo è che accederò agli oggetti solo in lettura, quindi non c'è il rischio di fare casini.

    Poi mi chiedo, ma questa è solo una considerazione perchè non mi permetto di mettere in dubbio quello che hai scritto. Abbiamo gli strumenti per girare e rigirare classi e oggetti come un calzino, e non abbiamo qualcosa che mi permetta di avere un elenco delle variabili locali di una procedura e accedere ad esse? Boh!

    E poi, la classe ParameterInfo... a che mi serve sapere il nome e il tipo di un oggetto se non mi dai un modo per potervi accedere!!!???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.