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

Framework .NET Discussion :

Trouver toutes les proprietes ou methode d'un objet [Fait]


Sujet :

Framework .NET

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut Trouver toutes les proprietes ou methode d'un objet
    Bonjour,
    Je suis a la recherche d'une classe dans le framework qui me permette d'initialise les proprietes d'un object a la vole.

    Je m'explique dans une base de donnee, j'ai dans une table control, le nom des proprietes, et des valeurs.

    ca donne quelque chose du genre :
    select * from tbl_control

    Resultat :

    Property | value
    Title mon control
    ID 1
    ...

    Donc je veux pouvoir parcourir mon control que j'instancie dynamique (pour ca pas de probleme ;-) )
    Ensuite je veux seter les valeurs des proprietes de cette objet avec les values trouvees!

    Du dynamisme en fait

    Merci
    Superfly

  2. #2
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut




    Toutes les semaines les mêmes questions...

  3. #3
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Regarde du coté de la Reflexion

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Regarde du coté de la Reflexion
    Tout se trouve dans le namespace System.Reflection.

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    Merci tout le monde j'ai trouve assez rapidement mon bonheur ;-)
    Mais j'ai un sale probleme avec les types de mes proprietes, je m'explique :

    J'ai bien sur dans la base toutes les proprietes sont enregistres en string, donc biensur lorsque mes proprietes sont des strings il n'y a pas de souci
    mais lorsque j'ai autre chose je mange de l'exception ce qui est normal!!

    Pourriez-vous me filer un coup de main, car j'ai bien sur une saloperie de proto a montrer demain et tout est casser ;-)

  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 : 42
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Ben si c'est autre chose que des string, il faut convertir... Par exemple si c'est un int, tu peux convertir comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int X = int.Parse(la_valeur_de_X_en_string);

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    Merci tomlev, je suis bien d'accord avec toi qu'il faut convertir.
    Maintenant imagine que tu es 15 types differents et que tu ne veuilles bien sur pas ecrire de Switch, case et autre truc du genre.

    Et que tu veuilles tout faire dynamiquement.
    Alors une idee pour convertir les types generiquement et dynamiquement?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    String propertyName = row["property_name"].ToString();
                    String propertyValue = row["property_value"].ToString();
     
                    System.Reflection.PropertyInfo propertyInfo = typeObj.GetProperty(propertyName);
     
                    Type propertyType = propertyInfo.PropertyType;
     
                    Convert.ChangeType(row["property_value"], propertyType);
    Voila mon code actuel, j'essaye de changer le type de la valeur row["property_value"], mais forcement ca marche pas

    Donc si vous avez une idee je suis carement preneur!

    Je vois mon erreur, c'est parceque j'utilise "Convert" qui ne prend en charge que les types de base.
    Il me faudrait la meme chose mais qui prennent en charge tous les types DOTNET.

    Quelqu'un aurait une idee?

    Merci

  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 : 42
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    la fonction Convert.ChangeType ne modifie pas l'objet passé en paramètre, elle renvoie un objet converti. Il faut donc que tu récupères la valeur de retour. Le problème, c'est que si tu veux l'assigner à une variable d'un type donné, il faut faire un cast explicite, à moins que le type de la variable à laquelle tu assignes la valeur définisse une conversion implicite à partir de Object (ce qui généralement n'est pas le cas). Par exemple, pour l'assigner à un int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int x = (int)(Convert.ChangeType(row["property_value"], propertyType));
    Mais tu te retrouves avec le même problème, il faut gérer les différents types possibles... cela dit, s'il y en a un nombre fini, ce n'est pas insurmontable, vu que la plupart des types qui peuvent se représenter complètement par une chaine proposent une conversion à partir d'une chaine. Mais tu devras quand même faire un switch...
    A moins de générer dynamiquement un bout de code qui fait le cast, mais ça me parait un peu bourrin

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    Merci pour ta nouvelle réponse tomlev, mais je suis toujours pas interessé par un switch.

    J'ai effectivement un normbre fini de type mais dans les environs de 20 le nombre fini, et il est hors de question que je fasse un switch j'aurais trop honte!!!

    En plus Dot.net fait ca tout le temps convertir une string dans le type qui va bien. Je vois pas pourquoi je pourrais pas le faire ;-).

    Pour le "Convert" je sais qu'il renvoie une valeur le bougre, et faire une conversion explicite nous renvoi au probleme de base!

    Donc il faut que j'arrive a faire ca il y a pas de mystere, on va quand meme pas se laisser emmerde par un type quand meme

    Je suis en train de faire quelques recherche sur Emit la solution se trouve peut-etre dans le coin!

    Sinon je continue sur le proto!!! Eh oui demain je suis sense montrer du visuel!!

    Superfly

  10. #10
    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 : 42
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Sinon je continue sur le proto!!! Eh oui demain je suis sense montrer du visuel!!
    Ben personne ira voir le code alors, si tu fais un switch ça se verra pas !
    Enfin, c'est clair que c'est pas la plus belle solution...

    Ah, au fait :
    Je vois mon erreur, c'est parceque j'utilise "Convert" qui ne prend en charge que les types de base.
    Il me faudrait la meme chose mais qui prennent en charge tous les types DOTNET
    C'est impossible ! Il y a plein de types qui ne sont pas sérialisables sous forme de chaine, donc je vois mal comment on pourrait faire ça. A la rigueur, en utilisant la sérialisation XML tu peux sérialiser pas mal de choses, mais là encore, tous les types ne sont pas sérialisables en XML...
    Bref, si tu cherches à pouvoir enregistrer et charger n'importe quel type sous forme de chaine, tu perds ton temps, c'est tout bonnement impossible...

    Mais en fait, je réalise un truc... je suppose que tu assignes les propriétés de tes objets dynamiquement par rapport au nom de la propriété dans la base de données ? Donc tu utilises la réflexion. Or, si tu regardes la classe PropertyInfo (descripteur d'une propriété), elle propose une fonction SetValue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public virtual void SetValue (
    	Object obj,
    	Object value,
    	Object[] index
    )
    Donc une fois que tu as obtenu ton objet PropertyInfo à partir des infos du type, tu as juste à faire ça (je reprends ton code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    String propertyName = row["property_name"].ToString();
                    String propertyValue = row["property_value"].ToString();
                    System.Reflection.PropertyInfo propertyInfo = typeObj.GetProperty(propertyName);
                    Type propertyType = propertyInfo.PropertyType;
                    object convertedValue = Convert.ChangeType(row["property_value"], propertyType);
                    propertyInfo.SetValue(theObject, convertedValue, null);
    Et comme l'argument de la fonction est de type Object, tu n'as pas de cast à faire... sauvé !

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    salut tomlev,

    Le truc c'est que l'on me demande un proto pendant le dev du produit, c'est pas logique mais c'est comme ca
    Alors qu'a plus ils ont deja un proto et il est en prod
    Mais bon il comprenne pas pourquoi je peux pas leur montrer un proto!!
    Je viens d'arriver dans la boite donc je vais m'enerve et je montre un proto

    J'ai bien pense a la meme chose que toi mais la methode Convert.ChangeType ne sais pas faire ce genre de chose elle explose et renvoi une belle exception :
    ControlManagerTests.SetPropertiesTest : System.InvalidCastException : Invalid cast from 'System.String' to 'System.Web.UI.WebControls.Unit'.

    Alors pour ce qui est de cast en permanance.
    Regardons ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    dotnetCHARTING.Chart chart = new dotnetCHARTING.Chart();
    chart.Height = 300
    Que fait le compilateur il prend les 300 qui sont des int et les converti en
    System.Web.UI.WebControls.Unit

    Je voudrais faire pareil avec des string c'est tout cela me semble pas infaisable ;-) mais j'y arrive pas ;-)

  12. #12
    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 : 42
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Je voudrais faire pareil avec des string c'est tout cela me semble pas infaisable
    Désolé, mais a priori ça l'est...

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    Ne dis pas ca tu es en train de me fendre le coeur tomlev.
    Tout mon archi par en fumer si je peux pas faire ca!

  14. #14
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    Etant donné qu'en informatique, tout fini par se trouver sous forme de 0 et de 1, tu dois pouvoir tout représenter avec des strings... Celà étant, je te souhaite bien du courage ;o)

  15. #15
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    Je ne doute pas de pouvoir trouver une solution, je vous la donnerez quand je l'aurais.

    J'ai d'autre probleme avec la reflexion, je vais ouvrir un autre post pour ca.

    Merci pour tout!

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Moi j'ai une solution ultragore qui m'évite le switch case, mais juste quelques cas à traiter.

    en fait je serialise/déserialise un objet mais pour cela au lieu de représenter chaque membre sous forme d'une chaine, je décompose le membre jusqu'a obtenir des types intégraux/primitifs ou des strings ou des tableaux, a partir de là il est relativement facile de faire l'opération inverse...
    je m'explique... tous les types primitifs ont leur équivalent objet par boxing/unboxing avec la méthode static Parse(chaine) qui retourne l'objet primitif voulu, tu fait donc un appel par reflexion sur son type, en précisant le nom de la méthode et que tu fait une invocation de méthode statique publique... et avec SetValue tu place le résultat

    pour le type chaine c'est encore mieux pas de conversion. et pour les types enum là par contre faut convertir la string en enum et là c'est pas forcément la joie, qu'a cela ne tienne j'ai une solution en cours de tests, si ca marche je t'en reparle

  17. #17
    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 : 42
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    pour les types enum là par contre faut convertir la string en enum et là c'est pas forcément la joie
    Au contraire, c'est tout simple ! Regarde la méthode statique Enum.Parse

  18. #18
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    tiens je l'avais meme pas vue celle la
    grrrr.... effectivement tant mieux
    Je devais pas être en forme quand j'ai regardé le type Enum pour avoir manqué ca

    Merci Tomlev

Discussions similaires

  1. [RegEx] Trouver toutes les dates dans un texte
    Par Shandler dans le forum Langage
    Réponses: 7
    Dernier message: 16/04/2008, 09h56
  2. [RegEx] Trouver toutes les URL
    Par stailer dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2008, 18h23
  3. Réponses: 3
    Dernier message: 20/01/2007, 19h09
  4. Heritage de toutes les proprietes de TCustomForm
    Par paolo2002 dans le forum Delphi
    Réponses: 5
    Dernier message: 10/08/2006, 13h45

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