Expert Système : Récupérer Variable par une String [Résolu]

Signaler
Messages postés
150
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
21 décembre 2007
-
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
-
Bon voila...Je suis un peu ambitieux mais bon je tente kememe..
Matos : C#
J'aimerais savoir si il y a une fonction système qui permet de récupérer une variable grâce à son nom en String???
Dacord je vous fait un pti exemple...meme pt 2...

Appelons cette fonction mystérieuse FctMagique

avec comme prototype : Object FctMagique(String)

int a=5;
......

et dans le code par exemple :
((int)FctMagique("a"))=12;

Et un autre exemple ca fait pas de mal...
Label Label1;
Label Label2;
Label Label3;

for (int i=1;i<4;i++) ((Label)FctMagique("Label"+i.ToString())).Text="Ceci est le Label " + i.ToString();

Voila je crois que le dernier est un peu plus parlant...
Je vais pas dire qu'une solution serait vital mais.....vraiment presque...car j'ai environ 40 Labels.....alors imaginez...

Ah oui derniere remarque...Bien sur la solution serait de passer carrement par un Tableau d'Object mais vu les circonstances je ne peux pas alors c'est pour ca qu'il me faudrait cette fonction magique
Il n'y a vraiment que cette solution pour me sauver la vie alors...si un expert passe par la...

Un grand merci, voir meme une ola pour celui qui trouvera la solution !!!

7 réponses

Messages postés
150
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
21 décembre 2007
2
Bon pour ceux qui passe par la, la solution en ASP.NET est d'utiliser la fonction FindControl :

    protected System.Web.UI.WebControls.Label Label1;
    protected System.Web.UI.WebControls.Label Label2;
    protected System.Web.UI.WebControls.Label Label3;
    protected System.Web.UI.WebControls.Label Label4;

...

for (int i=1;i<=4;i++) ((Label)this.FindControl("Label" + i.ToString())).Text="coucou cest le label " + i.ToString();

...
Par contre pour avoir la liste je galere encore un peu...

///////////////////////////////////////
Par contre ca ma donner une idée pour cette fonction magique!Surtt pour la version C++!
Etant donner que la ce sont des classes imbriqués ce sont forcement des listes de types à l'intérieur.
Donc il faut forcement les stocker et faire la correspondance entre les noms et le control
DONC! Ben comme en C++ il n'y a que des types primitifs, ben pour que ca marche il suffit de créer la meme chose quand C# avec les controls
Cest a dire un tableau qui fait la correspondance entre les nom(string) et les variables (Pointeur)
Du style :
List<String,void*> LstCrtl =new List<String,void*>;
int a=5;
String huhu="je suis la !";
...
LstCrtl.add("a",&a);
LstCrtl.add("huhu",&huhu);
...etc
enfin ce n'est qu'une idée apres pour le code, il faut poffiner un peu...

Merci kememe! J'avance a grand pas maintenant
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
Juste par curiosité, pourquoi le tableau ne marche pas ?

Autrement, une liste ou un dictionnaire peuvent aussi faire l'affaire.

Amicalement, SharpMao
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
22
Salut,


Une petite boucle sur tous les contrôles de ta feuille permet d'en
extraire les labels (à condition, dans l'exemple ci-dessous, que leurs
noms soient label1, label2, label3, ... )





            String indice = "";

            foreach (Control ctrl in this.Controls)

            {

               
if (ctrl.Name.Substring(0, 5) == "label")

                {

                   
indice = ctrl.Name.Substring(5);

                   
ctrl.Text = "Je m'appelle Label" + indice;

                }

            }
















Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
Messages postés
150
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
21 décembre 2007
2
Arf!!
Presque!
ouais c'est ca que je veux!
C'est vrai que je n'y avait pas penser étend donnée que je suis dans une classe qui hérite et qui hérite encore.........
Mais le problème est que je suis en ASP.NET

du coup...yorai moyen de l'adapter??
Car dans le type control, il n'y a pas de methode name, et en fesant la liste je n'est rien trouver...

 public class Test1 : System.Web.UI.Page
 {
    protected System.Web.UI.WebControls.Label Label1;
    protected System.Web.UI.WebControls.Label Label2;
    protected System.Web.UI.WebControls.Label Label3;
    protected System.Web.UI.WebControls.Label Label4;
    protected System.Web.UI.WebControls.DataGrid DataGrid1;
 
  private void Page_Load(object sender, System.EventArgs e)
   {
      String indice = "";
      foreach (Control ctrl in this.Controls)
      {
        if (ctrl.Name.Substring(0, 5) == "label")
        {
          indice = ctrl.Name.Substring(5);
          ctrl.Text = "Je m'appelle Label" + indice;
        }
      }
    }
}

merci d'avance

PS: Par contre si quelqu'un à quand meme trouver la fonction magique qu'il n'hésite pas!
Car pour les "int" ca ne marche pas...
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
22
Alors, tente ta question sur le forum d'
ASPFr.com

Là, je bloque aussi.





Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
Messages postés
150
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
21 décembre 2007
2
Ok
Merci pour l'idée ca assure!
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Bonjour à tous,

J'arrive en retard, juste pour indiquer qu'il existe un moyen relativement simple de récupérer la valeur d'une variable à partir de son nom en utilisant la réflection :


<hr />

// myType est le type dans lequel la variable recherchée est définie
// (obtenu par typeof() ou .GetType())

FieldInfo field = myType.GetField("variableName", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
{
   // Si le champ est statique
   object val = field.GetValue(null);

   

// Si c'est une variable d'instance, alors il faut passer en paramètre
   // une instance du type myType

   object val = field.GetValue(instanceOfMyType);
}
else
{
   // champ non trouvé
}
<hr />Cela ne permet bien sûr de récupérer que les variables définies dans un type (un champ dans une classe ou une structure). Les variables locales (définies dans une méthode)  ne peuvent pas être récupérées de cette manière. En fait, je ne pense pas qu'il soit possible de récupérer la valeur d'une variable locale à partir de son nom, dans la mesure où le nom des variables locales n'est pas stocké dans le code MSIL (elles sont référencées par leur index).