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 et constructeur d'une classe inconnue


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut Reflection et constructeur d'une classe inconnue
    Bonsoir à tous !
    Voici un nouveau probléme, j'entrevoie la solution mais je ne trouve pas l'implémentation :/
    le principe est d'utiliser la reflection pour instancier une classe "inconnue" mais qui implémente une interface.
    typiquement une interface IPoco et des classes contacts, villes etc... qui sont les liaisons (tables) avec une BDD SQL;
    Voici le principe http://www.codeproject.com/Articles/...-in-C-Tutorial
    Comme le montre le code il tape en "dur" les propriétés et les valeurs.. Donc inutile pour moi

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Récupérer le type de l'objet en réflection
                Type type = ClassePoco.GetType();
                // récupére tous les Get publics de la classe en filtrant par instance, public et property
                PropertyInfo[] proprietes = type.GetProperties(
                    BindingFlags.Instance
                    | BindingFlags.GetProperty
                    | BindingFlags.Public);
                // récupére le constructeur de la classe via son nom (moins le namespace)
                ConstructorInfo  construct = type.GetConstructor(Type.EmptyTypes);//.GetMethod(type.ToString().Remove(0, 9));
                // reste à trouver comment remplir les propriétés !
                object obj = construct.Invoke(new object[] { });
    je comprends qu'a la place de new object[] je devrais placer proprietes (PropertyInfo[]) et dans les {} les valeurs de chaque Propriétés (que je sais remplir via les infos de la table SQL).

    Je sais pas si je suis clair, mais autant en SQL c'est facile à faire, autant avec des POCO c'est chaud the night :/ Merci pour votre lecture et vos retour. KENAVO et bonne PROG ADN

  2. #2
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    Je pense avoir trouvé, j'ai d'autre soucis de compatibilité de type à passer dans le constructeur, mais je post mon code pour le partage et pour en discuter / optimiser.

    Soit on appel un Ctor vide : ConstructorInfo construct = type.GetConstructor(Type.EmptyTypes);
    Soit on lui donne un tableau de type appelé dans le Ctor:
    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
     // Récupérer le type de l'objet en réflection
                Type type = ClassePoco.GetType();
                // récupére tous les Get publics de la classe en filtrant par instance, public et property
                PropertyInfo[] proprietes = type.GetProperties(
                    BindingFlags.Instance
                    | BindingFlags.GetProperty
                    | BindingFlags.Public);
                // récupére tous les types public de cette classe (ils sont appelé dans le Ctor de la Poco)
                Type[] types = new Type[proprietes.Length]; 
                // prépare un tableau des données : récupére le nom des propriétés de la classe pour comparer avec les champs
    // et y trouver les valeurs à passer au Ctor
                String[] NomsPropriete = new String[proprietes.Length];
                int i=0;
                foreach (PropertyInfo proprieteinfos in proprietes)
                {
                    if (proprieteinfos.Name == "Id") continue; //ne traite pas la propriété public PkTable
     
                    types[i] = proprieteinfos.PropertyType;
                    NomsPropriete[i] = proprieteinfos.Name;
    // Cherche la concordance de Nom dans la collection d'userControl "Champs" et récupére la valeur saisi par l'User 
                    object valeur = ListeChamps.FirstOrDefault(t => t.nomChamp == proprieteinfos.Name).Value;
                    proprieteinfos.SetValue(proprieteinfos.Name, valeur, null);
                    i++;
                }
     
                // récupére le constructeur de la classe en lui passant la liste des types attendus pas le Ctor
                ConstructorInfo construct = type.GetConstructor(types);
    Voila où j'en suis, le test avec un remplissage en dur retourne bien une instance viable, reste à passer les valeurs en lieu et lace.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    object obj = construct.Invoke(new object[] {"commentaire","29/04/2015","mail","telfixe","telmobile","fax","nom","prenom",1});

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut Code qui marche !
    Voici le code qui retourne bien un objet inconnu du formulaire de remplissage :
    1*-l'objet hérite d'une interface commune à tous les objets à passer à la form
    2*-passer un objet vide à la form
    3*-récupérer l'objet rempli
    J'attends vos remarques

    Utilisation dans le projet "HOST":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Contact C = new Contact();
                CreerPoco FCreer = new CreerPoco(C);
                FCreer.ShowDialog();
                C = (Contact)FCreer.ClassePoco;
    Implémentation lors du clic sur BP OK de la form de remplissage :
    (listeChamps est une collection de zone de saisie qui retourne Value)
    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
            private void bpOk_Click(object sender, EventArgs e)
            {
                // Récupérer le type de l'objet en réflection
                Type type = ClassePoco.GetType();
                // récupére tous les Get publics de la classe en filtrant par instance, public et property
                PropertyInfo[] proprietes = type.GetProperties(
                    BindingFlags.Instance
                    | BindingFlags.GetProperty
                    | BindingFlags.Public);
     
                foreach (PropertyInfo proprieteinfos in proprietes)
                {
                    object valeur = ListeChamps.FirstOrDefault(t => t.nomChamp == proprieteinfos.Name).Value;
                    proprieteinfos.SetValue(ClassePoco, valeur, null);
     
                }
     
            }
    s'était bien plus simple que mon usine à gaz d'avant
    Voila fin du topic en mode solo ( vos remarques et compléments sont les bien venu ) KENAVO !

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

Discussions similaires

  1. [POO] constructeur d'une class
    Par spirou dans le forum Langage
    Réponses: 13
    Dernier message: 05/07/2006, 16h11
  2. [Débutant] Constructeur d'une classe
    Par chennuo dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2006, 22h17
  3. Réponses: 2
    Dernier message: 04/12/2005, 21h10
  4. Réponses: 5
    Dernier message: 20/11/2005, 11h15
  5. Réponses: 3
    Dernier message: 06/11/2005, 18h02

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