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 :

Reflection sur propriété


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Par défaut Reflection sur propriété
    Bonjour,

    Imaginons une classe
    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
    21
    22
     
    class toto {
     
    private double _prix;
    public double prix 
    {
    get {return _prix;}
    set {_prix = value; onPropertyChanged("prix") ;}
    }
     
     
    private double _quantite;
    public double quantite 
    {
    get {return _quantite;}
    set {_quantite = value; onPropertyChanged("quantite") ;}
    }
     
    public double valeur 
    {
    get {return prix * quantite;}
    }
    J'aimerais pouvoir créer le graph de dépendance entre propriétés:
    - la modif de prix fait modifié valeur
    - la modif de quantité fait modifié valeur
    Si prix est modifié alors je veux qu'il y ait un onPropertyChanged d'appeler pour valeur.


    Peut on utiliser la réflexion pour faire ceci? et donc pouvoir définir les liens entre propriétés?

    L'idéal étant de pouvoir le faire entre plusieurs classes....

    Thx pour l'aide

  2. #2
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut
    Ce serait plutot des listeners qui serait intéressant dans ton cas.

    Un truc dans le genre permet de changer le prix et d'afficher la valeur modifié

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
        public class cPrix
        {
            public event EventHandler<EventArgs> OnPropertyChanged;
            private double _prix;
     
            public double Prix
            {
                get { return _prix; }
                set
                {
                    _prix = value;
                    OnPropertyChanged(this, EventArgs.Empty);
                }
            }
     
            public double Valeur
            {
                get { return Prix * 10; }
            }
        }
     
        public class Main
        {
            private cPrix p;
     
            public void onLoad()
            {
                p = new cPrix();
                p.OnPropertyChanged += new EventHandler<EventArgs>(p_OnPropertyChanged);
     
                //Affichage de la valeur
                lblValeur.Text = p.Valeur;
            }
     
            public void p_OnPropertyChanged(object sender, EventArgs e)
            {
                //Mise à jour de la valeur à chaque chgt de prix
                lblValeur.Text = p.Valeur;
            }
     
            public void ChangePrix()
            {
                //Chgt de prix qui déclenchera la mise à jour de la valeur
                p.Prix = 12;
            }
        }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Par défaut
    ouais mais justement je veux pas faire un listener par propriété, cest moche..

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par escafr Voir le message
    Peut on utiliser la réflexion pour faire ceci? et donc pouvoir définir les liens entre propriétés?
    Non, ce n'est pas possible : la réflexion permet d'examiner la signature et les métadonnées des membres de classe, mais pas leur code...

    La solution généralement utilisée dans ce genre de cas est d'appeler onPropertyChanged pour toutes les propriétés dont tu sais qu'elles seront impactées :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    class toto
    {
        private double _prix;
        public double prix 
        {
            get {return _prix;}
            set
            {
                _prix = value;
                onPropertyChanged("prix") ;
                onPropertyChanged("valeur") ;
            }
        }
     
        private double _quantite;
        public double quantite 
        {
            get { return _quantite; }
            set
            {
                _quantite = value;
                onPropertyChanged("quantite") ;
                onPropertyChanged("valeur") ;
            }
        }
     
        public double valeur 
        {
            get { return prix * quantite; }
        }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Par défaut
    je m'en doutais un peu.

    J'ai fait tout un truc pour que ce soit plus propre pour créer un arbre.

    si ca vous interesse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    protected override void initPropertiesDependencies()
            {
                propertiesDependencies = new Dictionary<string, List<PairObjProperty>>
                {
                    {"solde", new List<PairObjProperty> {new PairObjProperty(this,"recommandedNominalRestant"), new PairObjProperty(this,"nominalRestant")}},
                    {"obsTitresEligibles", new List<PairObjProperty> {new PairObjProperty(this,"dicoTitresEligibles"), new PairObjProperty(this,"sommeTitresEligiblesRestant"), new PairObjProperty(this,"sommeTitresEligibles")} },
                    {"obsTitresSelectionnes", new List<PairObjProperty> {new PairObjProperty(this,"nominal"), new PairObjProperty(this,"recommandedNominal"), new PairObjProperty(this,"sommeTitresEligibles")} },
                    {"recommandedNominal", new List<PairObjProperty> {new PairObjProperty(this,"recommandedNominalRestant")}},
                    {"nominal", new List<PairObjProperty> {new PairObjProperty(this,"nominalRestant")}}
                };
            }
    avec ca j'initialise toutes les dependences simples, puis un ptit algo bidon genere toutes les dependences pour 1 prop.
    apres suffit d'appeler OnPropertyChange("laprop") et ca appelle tous les autres.. mais c'est pas super joli...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    bien vu... mais j'ai peur que ça fasse perdre plus de temps de créer l'arbre de dépendences que de gérer ça manuellement

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Par défaut
    la clarté du code m importe plus que la rapidité de celui ci....
    Qd tu dois gerer les dependences sur 10-15 prop dans 10 classes differentes.. ca peut vite devenir le bordel à debuguer..

    Puis je crée mon arbre que qd je crée mon obj, après c'est good..

    je pourrais meme pousser le vice en créant tout ca statiquement, comme ca c'est fait une bonne fois pour toute au debut du programme..
    la reflection me servira à recuperer mes props dynamiquements
    donc ca fera un graph par Classe au lieu d'un graph par objet, ce qui n'est pas top top..

    la seule utilité de ca étant que je veux pouvoir appelé le onPropertyChange sur des Prop d'une autre classe .
    exemple rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A 
    {
       public Type obj {get; set {_obj = value; OnPropertyChange("obj")}}
    }
     
    class B
    {
      public A a {get; set {_a = value; OnPropertyChange("a"); value.OnPropertyChange("obj");
    }
    Il y a un peu plus de boulot mais ca pourrait etre super efficace...je verrais ca demain..

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par escafr Voir le message
    la clarté du code m importe plus que la rapidité de celui ci....
    En fait je ne parlais pas de la rapidité du code, mais de la rapidité de développement

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/07/2006, 09h57
  2. Réponses: 10
    Dernier message: 10/04/2006, 13h26
  3. Réponses: 10
    Dernier message: 20/01/2006, 11h50
  4. Réponses: 4
    Dernier message: 11/10/2005, 20h12
  5. Réponses: 12
    Dernier message: 12/12/2004, 14h25

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