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

Windows Forms Discussion :

Accéder aux propriétés d'un objet instancié avec Activator.CreateInstance


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 29
    Points : 25
    Points
    25
    Par défaut Accéder aux propriétés d'un objet instancié avec Activator.CreateInstance
    Bonjour,
    mon problème est assez tordu.
    Je dois imprimer des étiquettes. J'ai créé une classe parent pour les fonctions/propriétés communes à toutes les étiquettes et des classes enfant pour chaque type d'étiquette.
    Je souhaite lancer l'impression en passant par un code générique qui recevra en paramètre le nom du type d'étiquette et instanciera l'objet adéquat.
    Jusqu'ici tout va bien sauf que je ne peux accéder aux propriétés de cet objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Type t = Type.GetType(stickerType);
    object etiq;
    etiq = Activator.CreateInstance(t); //jusqu'ici c'est bon
    etiq.verticalIntMargin=10; //la propriété n'existe pas avec l'exécution et c'est          normal
    Je suis bloqué et je suis pourtant sûr qu'il y a un moyen de le faire passer.
    Merci d'avance pour votre aide
    Lionel

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Et comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((stickerType)etiq).verticalIntMargin = 10;
    Le problème, c'est que comme tu l'as dit, tu veux rester "générique".
    Si verticalIntMargin est une propriété de la classe mère, tu peux caster avec le type de la classe mère pour que ce code fonctionne avec tout les type d'étiquettes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((nomClasseMère)etiq).verticalIntMargin = 10;

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    Hello,
    merci pour ta réponse.
    Ca marche......presque...

    en fait je dois ensuite accéder à une fonction de génération du contenu de l'étiquette et cette dernière est dépendante du type. La classe mère ne contient pas cette fonction qui est présente dans chacune des classes enfant avec les mêmes paramètres mais dont le contenu change.
    En tout cas j'avance ......

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    La méthode facile mais qui demande une maintenance de la fonction de génération de contenu à chaque fois qu'un nouveau type est ajouté, c'est d'utiliser le mot clé is pour checker à quel type d'objet on a affaire.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    OK, je vois où tu veux en venir mais dans ce cas là les classes dérivées pour chaque type d'étiquette n'ont plus lieu d'être.
    En effet, la méthode de génération des étiquettes fait appel à certaines variables supplémentaires non définies dans la classe mère.
    Dans ce cas je suis obligé de tout rapatrier dans la classe mère (variables ET fonction de génération)

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    De retour.....
    j'ai trouvé une solution et je la poste à tout hasard si quelqu'un avait le même problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //stickerType est une string définissant le type de l'objet à créer dynamiquement.
    Type t = Type.GetType(stickerType);
    object etiq;
    etiq = Activator.CreateInstance(t);       
    PropertyInfo verticalIntMargin= t.GetProperty("verticalIntMargin"); 
    //verticalIntMargin est ma propriété de type string
    verticalIntMargin.SetValue(etiq, "ma valeur de la propriété dans le bon type", null);
    avec cette méthode j'arrive à "setter" la propriété de l'objet de classe stickerType.
    Je me suis inspiré d'un bout de code trouvé sur Google permettant d'accéder à une méthode dans le même cas de figure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Type t = Type.GetType("AutreNamespace.ClassTest");
    Object MonObjet = Activator.CreateInstance(t);
    Type[] paramTypes = new Type[2];
    paramTypes[0]= typeof(string);
    paramTypes[1]= typeof(string);
    MethodInfo Concat = t.GetMethod("Concatener",paramTypes);
    Object[] parameters = new Object[2];
    parameters[0] = "chaine début";
    parameters[1] = "chaine fin";
    //appel à la fonction en passant les 2 paramètres et récupère la chaîne concaténée
    string returnVal = (string) ConcatInfo.Invoke(MonObjet ,parameters);
    Merci pour votre aide

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/11/2009, 18h46
  2. Comment accéder aux propriétés d'un objet de la bibliothèque
    Par jpboogie dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 11/02/2009, 10h57
  3. [Smarty] Comment accéder aux propriétés d'un objet dans un objet ?
    Par Tanebisse dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 18/11/2008, 12h36
  4. Réponses: 2
    Dernier message: 09/11/2007, 15h32
  5. Accéder aux propriétés d'un objet créé au runtime
    Par zarbouine dans le forum Delphi
    Réponses: 6
    Dernier message: 14/12/2006, 17h03

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