IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Réinitialiser les valeurs des Properties d'une classe


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut Réinitialiser les valeurs des Properties d'une classe
    Bonjour à tous,

    Est il possible de réinitialiser toutes les porperties d'une classes avec une méthode ? Et si oui laquelle ?

    Exemple - définition de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class  a
    {
    public int a {get; set;}
    public string b {get; set;}
     
    public a(int x, string y)
    {
    this.a = x;
    this.b = y
    }
    }
    Dans le programme on aurait une instance de classe avec la property a = 55 et b = "Coucou". C'est un exemple en gros il ont des valeurs.

    Je voudrais grâce a une méthode retrouvé les valeurs par défaut de n'importe que type de property au sein de la classe. C'est à dire que pour mon exemple a = 0 ( default int) et b = "" ou string.empty (default string).

    Donc existe t'il une fonction pour réaliser ce problème ?

    Merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Points : 625
    Points
    625
    Par défaut
    Salut,
    réponse : Non
    Donc deux possibilités :

    - Tu ré-instancies ton instance de classe (mais là tu perds tout)
    - Tu crées une Méthode ReInitialise() (par exemple) ou tu remets toutes les valeurs à 0 (ou autre...)

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Avec la reflection tu peux enumerer sur tous les champs de ton objet et ainsi récuperer leurs types. Pour chaque champ, une fois que tu as son type, tu peux créer un objet de ce type et l'affecter.

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Merci pour vos réponses.

    J'utilise la réflexion pour atteindre toutes les properties de ma classe. Je réussi bien à récupérer le type de la property mais je penssais utiliser Activator.CreateInstance(PropertyType) pour récupérer une instance vierge correspondant donc à ma valeur par défaut du type.

    Mais j'ai une execption car le constructeur n'a pas été trouvé. Normal car par exemple le contructeur new string() n'existe d'ou l'erreur récupéré. Car Activator.CreateInstance essayer d'instancier une classe avec son constructeur vide.

    Quelle est ta méthode pour récupérer une nouvelle instance en fonction du type récupérer ?

    Mon Code actuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     // data correspond à une instance de classe
    // GetCollumnProperties me renvoient tous les properties de la classe donné en paramètres
    foreach (PropertyInfo prop in DxErrorProvider.GetColumnProperties(data))
    {
           object objDefault = Activator.CreateInstance(prop.PropertyType);
           PropInf.SetValue(data, objDefault, null);
    }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 99
    Points : 122
    Points
    122
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Type classType =...
    ConstructorInfo constructorInfo = classType.GetConstructor(...
    MonInstance = constructorInfo.Invoke(...
    Je trouve ton idée...surprenante

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Points : 625
    Points
    625
    Par défaut
    héhé, pourquoi faire simple quand on peut faire compliqué

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    C'est pas si simple en fait.

    Mon programme fonctionne avec LinqToSql comme couche d'accès au données de la base de données. Ce qui est une grosse prise de tête enfin bon ...

    J'ouvre un formulaire qui contient une GridControl(grille de données) contenant toutes les lignes présentes dans la base. En double cliquant sur une ligne, je lance un nouveau formulaire pour voir plus de détails.

    Une ligne correspond à une classe qui a été généré par LinqToSql contenant une property pour chaque champ présent dans ma table qui binder sur la grille.

    Le problème est que quand j'ouvre le détail d'une ligne qui n'est pas rattaché à l'origine au DataContext, je ne détecte pas si des modifications ont été appliqués sur mon objet. Je peux donc pas les annuler. Je suis donc obligé de balayer toutes les properties afin d'éffacer et de remplacer toutes ces valeurs par celle d'origine.

    Enfin bon c'est super relou, sans connaitre LingToSql ca sera du charabia ...

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    bon j'ai trouvé ma solution. je poste le code au cas ou quelqu'un aurait l'esprit aussi tordu que le mien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    internal static bool ResetData(object data)
            {
                try
                {
                    ConstructorInfo cstr = data.GetType().GetConstructor(new Type[] { });
                    object objRef = cstr.Invoke(new object[] { });
     
                    foreach (PropertyInfo prop in DxErrorProvider.GetColumnProperties(data))
                    {
                        prop.SetValue(data, objRef.GetType().GetProperty(prop.Name).GetValue(objRef, null), null);
                    }
     
                    return true;
                }
                catch
                {
                    XtraMessageBox.Show("Une erreur est survenue durant la réinitialisation de l'object");
                    return false;
                }
            }

  9. #9
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 50
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par TeK55 Voir le message
    Une ligne correspond à une classe qui a été généré par LinqToSql contenant une property pour chaque champ présent dans ma table qui binder sur la grille.

    Le problème est que quand j'ouvre le détail d'une ligne qui n'est pas rattaché à l'origine au DataContext, je ne détecte pas si des modifications ont été appliqués sur mon objet. Je peux donc pas les annuler. Je suis donc obligé de balayer toutes les properties afin d'éffacer et de remplacer toutes ces valeurs par celle d'origine
    Pour ce problème c'est simple je crois.
    Pour ton GirdControl tu peux convertir ton élément sélectionnée vers le type de retour de LINQ
    C’est à dire si le type de retour de LINQ est client tu peux faire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client myClient= myGrid.SelectedItem as client
    et la t'as tout les données de ton client sélectionnée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Les valeurs des tableaux dans une matrice
    Par fatma hamdi dans le forum Fortran
    Réponses: 1
    Dernier message: 30/03/2008, 23h33
  2. Réponses: 2
    Dernier message: 26/12/2007, 13h46
  3. Gestion des 'property' d'une classe
    Par philnext dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2007, 08h45
  4. Réponses: 2
    Dernier message: 06/04/2007, 10h26
  5. Pouvoir gérer les actions des boutons dans une classe
    Par Cyborg289 dans le forum Composants
    Réponses: 2
    Dernier message: 08/07/2005, 12h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo