Acces a une variable grace a son nom sous forme de chaine de caractères [Résolu]

lucss4 23 Messages postés lundi 29 octobre 2007Date d'inscription 21 avril 2011 Dernière intervention - 13 avril 2011 à 16:14 - Dernière réponse : LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention
- 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...
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention - 13 avril 2011 à 18:21
3
Merci
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 !!

Merci LUDINSKI 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de LUDINSKI
Meilleure réponse
LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention - 13 avril 2011 à 19:28
3
Merci
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 !!

Merci LUDINSKI 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de LUDINSKI
lucss4 23 Messages postés lundi 29 octobre 2007Date d'inscription 21 avril 2011 Dernière intervention - 13 avril 2011 à 18:50
0
Merci
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 !!
Commenter la réponse de lucss4
lucss4 23 Messages postés lundi 29 octobre 2007Date d'inscription 21 avril 2011 Dernière intervention - 13 avril 2011 à 19:53
0
Merci
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 !
Commenter la réponse de lucss4
lucss4 23 Messages postés lundi 29 octobre 2007Date d'inscription 21 avril 2011 Dernière intervention - 14 avril 2011 à 09:20
0
Merci
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 :)
Commenter la réponse de lucss4
lucss4 23 Messages postés lundi 29 octobre 2007Date d'inscription 21 avril 2011 Dernière intervention - 14 avril 2011 à 09:52
0
Merci
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
Commenter la réponse de lucss4
LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention - 14 avril 2011 à 09:55
0
Merci
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 ;)
Commenter la réponse de LUDINSKI
LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention - 14 avril 2011 à 10:44
0
Merci
Y'a pas de stress...
Content d'avoir pu t'aider !

Bonne continuation ;)
Commenter la réponse de LUDINSKI

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.