Acces a une variable grace a son nom sous forme de chaine de caractères

Résolu
lucss4 Messages postés 23 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 21 avril 2011 - 13 avril 2011 à 16:14
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 - 14 avril 2011 à 10:44
Bonjour !

Débutant en C#, je cherche depuis quelques heures (jours ? ) un moyen d’accéder a une variable dans ma classe principale par une chaine de caractère dans une classe a part (ma classe principale est dans le fichier program.cs et ma classe dérivée dans classe.cs).

Dans mon programme principal j’instancie ma classe grâce a
"Classe classe = new Classe();"
puis je fais passer une chaine grâce a un attribut :
"classe.text = "maVar=@maVar";" où maVar est définie comme ceci dans la classe program : "static string maVar;"

un parser dans ma classe "Classe" permet de récupérer tout les noms de variables dans un tableau de string. (par la suite j'utilise les noms des variables en association avec les valeurs dans la classe program pour créer une requête SQL , mais pour çà ... il faut les valeurs )

tout cela car je ne peux pas remplacer directement @maVar par sa valeur et il faut que je passe par des paramètres SQL comme ceci :
"command.Parameters.Add(TabParam[i]);" etc...

Bref je ne peux donc pas accéder, ni au type de la variable "maVar"(pour les paramètres) ni a son contenu (pour la requête).

Merci d'avance...

8 réponses

LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
13 avril 2011 à 18:21
Salut,

Tu peux utiliser la Reflexion pour ce faire :
using System.Reflection;

// La liste des valeurs à affecter aux champs
SortedList<string, string> fieldValues = new SortedList<string,string>();
fieldValues.Add( "maVar", "test" );

// Récupère la liste des variables statiques non publiques de la classe Program
FieldInfo[] staticFields = typeof( Program ).GetFields( BindingFlags.Static | BindingFlags.NonPublic );

// Parcourt la liste de variables
foreach( FieldInfo field in staticFields )
{
    // Une valeur doit être affecté au champ 
    if( fieldValues.ContainsKey( field.Name ) )
        // Affecte la valeur
        field.SetValue( null, fieldValues[ field.Name ] );
}


Mais attention, dans cet exemple, toutes les variables statique de la classe Program doivent être de type String !!
3
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
13 avril 2011 à 19:28
Je peux te proposer ces deux méthodes :
// Affecte la valeur issue de la base de données à une variable de la classe Program
private void SetValue( string varName, DataRow dataRow )
{
    FieldInfo field = typeof( Program ).GetField( varName, BindingFlags.NonPublic | BindingFlags.Static );

    if( field == null )
        throw new ArgumentException( "La variable '" + varName + "' n'est pas définie dans la classe Program" );

    field.SetValue( null, dataRow[ varName ] );
}

// Retourne un SqlParameter affecté de la valeur d'une variable d'après son nom
private SqlParameter GetParameter( string varName )
{
    FieldInfo field = typeof( Program ).GetField( varName, BindingFlags.NonPublic | BindingFlags.Static );

    if( field == null )
        throw new ArgumentException( "La variable '" + varName + "' n'est pas définie dans la classe Program" );

    SqlDbType dbType;
    switch( field.FieldType.FullName )
    {
        case( "System.String" ) :
            dbType = SqlDbType.VarChar;
            break;

        case( "System.Int32" ) :
            dbType = SqlDbType.Int;
            break;

        case ("System.DateTime"):
            dbType = SqlDbType.DateTime;
            break;

        default :
            throw new ArgumentException( "Une variable de type '" + field.FieldType.FullName + "' ne peut pas être converti en SqlDbType" );
    }

    SqlParameter parameter = new SqlParameter( varName, dbType );
    parameter.Value = field.GetValue( null );

    return parameter;
}


A utiliser de la manière suivante :
// Récupération des valeurs pour la mise en base
SqlParameter param1 = GetParameter( "maVar" );
SqlParameter param2 = GetParameter( "autreVar" );
SqlParameter param3 = GetParameter( "dateVar" );

// Mise à jour des valeurs depuis la base
DataRow dbRow = dataSet.Tables[ 0 ].Rows[ 0 ];
SetValue( "maVar", dbRow );
SetValue( "autreVar", dbRow );
SetValue( "dateVar", dbRow );


J'ai utiliser les variables suivantes :
static class Program
{
    private static string maVar;
    private static int autreVar;
    private static DateTime dateVar;
}


En espérant que ça t'aide...
Si tu as besoin d'explications sur le code n'hésites pas !!
3
lucss4 Messages postés 23 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 21 avril 2011
13 avril 2011 à 18:50
Re-bonjour !

Je suis pas vraiment encore a l'aise avec le C# et comprends très difficilement la Reflexion je rechercherais plus en detail les significations des fields etc des que je peux.
Je testerais ce bout de code malgré tout des que je retrouve l'usage de l'ordinateur sur lequel je travaille. En attendant il reste toujours un problème ! En effet les variables dans mon programme peuvent être de n importe quel type vu que ce sont les variables d'une requête de base de donnée :s

je doit ensuite définir les paramètres un a un, en testant le type des variables pour affecter le bon SqlDbType a SqlParameter puis acceder a la valeur de la variable pour l affecter au paramètre !

si tu peux m'éclairer !

merci beaucoup pour ta réponse très rapide !!
0
lucss4 Messages postés 23 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 21 avril 2011
13 avril 2011 à 19:53
Oui ! Ca va m'aider énormément en effet !

Je gèrerais les paramètres grâce a une table de SqlParameter que je puisse en initialiser un nombre indéfini (en fonction du nombre de variable dans ma requête)

En tout cas réponse super rapide , vraiment un grand merci .
Si des questions me viennent j'en ferais part :)

Bonne soirée !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lucss4 Messages postés 23 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 21 avril 2011
14 avril 2011 à 09:20
Bonjour a nouveau !

Je suis confronté a une nouvelle erreur en utilisant ce code qui au passage fonctionne merveilleusement bien ! Malheureusement il ne m'affecte pas la valeur a mon paramètre "@naVar"

Erreur : " La requête paramétrée '**la requête**' attends le paramètre @maVar, qui n'a pas été fourni.

Erreur produite a cette ligne : command.ExecuteNonQuery();

la commande juste avant est celle ci : command.CommandText = XExec;

Ici XExec est ma requete sous forme de chaine que je créé dans une autre fonction (comportant les SqlParameter et la récupération des variables )

Merci d'avance :)
0
lucss4 Messages postés 23 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 21 avril 2011
14 avril 2011 à 09:52
Stop !

J'ai fait mon boulet !! oublié d'initialiser ma variable

aucun souci ça marche enfin :')))))))

for (int i = 0; 1000<i; i++)
Console.Write("Merci !");

ps : désolé triple post :s
0
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
14 avril 2011 à 09:55
Bonjour,

Il semble que tu n'as pas déclaré de variable "naVar" dans ta classe Program.
Ou bien que cette variable n'est pas déclaré en private static

Vérifies de ce côté... si le problème persiste, je te demanderai de me fournir ton code, que je puisse jeter un oeil...

Cordialement ;)
0
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
14 avril 2011 à 10:44
Y'a pas de stress...
Content d'avoir pu t'aider !

Bonne continuation ;)
0
Rejoignez-nous