Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    81

    [C#]Chiamata di una funzione da contenuto variabile

    Salve,
    forse dal titolo non si capisce molto,
    ma il mio problema è il seguente.

    Io devo chiamare una funzione il cui nome è contenuto
    in una variabile.
    Specifico inoltre che ho oltre 300 funzioni,
    quindi non posso fare una struttura if-else if

    Cosa mi consigliate?
    E' possibile chiamare una funzione dal contenuto di una variabile?

    Grazie in anticipo,
    yomega

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Guarda questo codice

    codice:
            private static void func1(int x)
            {
                Console.WriteLine("func1 " + x.ToString ());
            }
    
    
            private static void func2(int x)
            {
                Console.WriteLine("func2 " + x.ToString());
            }
    
    
            private static void func3(int x)
            {
                Console.WriteLine("func3 " + x.ToString());
            }
    
    
            static void Main(string[] args)
            {
                Dictionary<int, Action<int>> funcs = new Dictionary<int, Action<int>>();
                funcs.Add(1, func1);
                funcs.Add(2, func2);
                funcs.Add(3, func3);
    
    
    
    
                (funcs[2])(12345);
            }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    81
    Fantastico,
    grazie mille.
    Resta solo una domanda
    nel chiamare (funcs[2])(12345)
    quell'12345 può essere sostituito con una stringa?
    Suppongo che basti cambiare Action<int> in Action<string>,
    ma forse mi sbaglio

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Certo ... basta cambiare i parametri ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    81
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Certo ... basta cambiare i parametri ...
    Scusa il ritardo, ero a patente.
    Grazie mille, era proprio ciò che mi serviva.
    Semplice ed efficace.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2015
    Messaggi
    57
    un altra soluzione è usare

    codice:
    using System.Reflection;
    per poter accedere a tutti i metodi e proprietà di un oggetto

    codice:
    public static void Main(string[] args)
     { 
      Type type = typeof(Program);
      string functionName = "Method1";
      MethodInfo method = type.GetMethod(functionName);
      object[] parameters = new object[] { 10, 20 };
      int result = (int)method.Invoke(null, parameters);
      Console.WriteLine(functionName + " result: " + result);
    }
    
    public static int Method1(int a, int b)
    {
      return a + b;
    }
    type: il tipo di oggetto dove risiedono i tuoi metodi.
    functionName: nome della funzione in stringa.
    MethodInfo: il metodo generato dal type.
    parameters: gli eventuali parametri della tua funzione.

    codice:
    int result = (int)method.Invoke(null, parameters);
    method.Invoke: richiama la funzione, se il metodo è statico il primo argomento viene ignorato, altrimenti devi passare la referenza dell'oggetto che possiede i metodi, secondo argomento gli eventuali parametri.
    Ultima modifica di Marsh; 08-10-2015 a 10:51

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    81
    Ottimo anche il secondo metodo, grazie per la risposta.
    Però per il mio problema è più utile il primo,
    dato che i nomi di tutte le funzioni li ho in un file e tramite while() li inserisco nel dictionary.
    Grazie mille lo stesso

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 © 2024 vBulletin Solutions, Inc. All rights reserved.