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 :

[.NET2.0][C#]Passage type de classe dans une fonction


Sujet :

Windows Forms

  1. #1
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut [.NET2.0][C#]Passage type de classe dans une fonction
    Bonjour,


    Je voudrais savoir s'il est possible de passer un type de classe à une fonction, pour pouvoir utiliser ce type pour la création d'instances dans cette fonction.
    (J'espère que je me fais bien comprendre )

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void MaFonction(??? type_de_classe)
    {
    <div style="margin-left:40px">(type_de_classe)variable = new (type_de_classe());
    ...</div>}
    où "type_de_classe" serait System.Windows.Forms.Form

    => Donc je ne passerais pas une variable d'un certain type à la fonction, mais le type lui-même, et j'utiliserais ce type pour créer des instances...

    Peut-on faire ça, et si oui comment ???

    Merci.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Pas sur d'avoir vraiment compris,
    mais c'est peut etre un truc du genre :

    private void MaFonction(Type tType)
    {
    // ici tu choisis le constructeur a utiliser
    ConstructorInfo ci=tType.GetConstructor(new Type[0]);

    object variable =ci.Invoke(new object[0]);

    }

    Pjam

  3. #3
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    OK c'est juste ce qu'il me fallait... Ca fonctionne, mais je voudrais votre avis !

    Je voulais faire une procédure qui me permette, dans une application Mdi, de réactiver une fenêtre enfant si elle existe déjà, ou la créer sinon, et ce pour n'importe quel type de fenêtre du projet.

    Voici ce que j'ai fait :

    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
     
            private void TSBPays_Click(object sender, EventArgs e)
            {
                ActiveOrCreateMdi(typeof(FenPays));
            }
     
            private void TSBLocalite_Click(object sender, EventArgs e)
            {
                ActiveOrCreateMdi(typeof(FenLocalite));
            }
     
            private void ActiveOrCreateMdi(Type pType)
            {
                if (pType.BaseType == typeof(Form)) // Si le type en paramètre est correct
                {
                    Form MdiWindow = null;
                    bool exist = false;
     
                    foreach (object ob in this.MdiChildren)
                    {
                        if (ob.GetType() == pType)
                        {
                            MdiWindow = (Form)ob;
                            exist = true;
                            break;
                        }
                    }
     
                    if (exist)
                    {
                        MdiWindow.Activate();
                        if (MdiWindow.WindowState == FormWindowState.Minimized) MdiWindow.WindowState = FormWindowState.Normal;
                    }
                    else
                    {
                        ConstructorInfo ci = pType.GetConstructor(new Type[] { typeof(FbConnection) });
                        MdiWindow = (Form)ci.Invoke(new object[] { this.FbConx });
                        MdiWindow.MdiParent = this;
                        MdiWindow.Show();
                    }
                }
                else
                {
                    throw new InvalidCastException();
                }
            }
    Ca fonctionne bien, mais est-ce que ma méthode est bonne ?
    Y'a-t-il moyen de faire plus simple ?

    Merci.

    @+

  4. #4
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Dans la fonction ci-dessus, je voudrais pouvoir remplacer la cast (Form) par le type exact de la fenêtre appelée, au lieu du type de base, car j'ai surchargé la fonction Show() de mes fenêtres, donc avec ce cast elle n'est jamais appelée.

    Donc je voudrais remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MdiWindow = (Form)ci.Invoke(new object[] { this.FbConx });
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MdiWindow = (Casting via System.Reflexion)ci.Invoke(new object[] { this.FbConx });
    Comment fait-on ça ?

    Merci.

  5. #5
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    OK J'ai trouvé !

    Voilà ce que j'ai fait, dans le "else" du "if(exist)" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ConstructorInfo ci = pType.GetConstructor(new Type[] { typeof(FbConnection) });
    object o = ci.Invoke(new object[] { this.FbConx });
    PropertyInfo pi = pType.GetProperty("MdiParent");
    pi.SetValue(o,this,null);
    MethodInfo mi = pType.GetMethod("Show", new Type[0]);
    mi.Invoke(o, null);
    @+

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

Discussions similaires

  1. appel d'une classe dans une fonction
    Par fraisa1985 dans le forum Général Java
    Réponses: 7
    Dernier message: 27/03/2008, 12h11
  2. Comment créer une liste ou une instance de classe dans une fonction ?
    Par Neolander dans le forum Général Python
    Réponses: 9
    Dernier message: 05/03/2008, 19h22
  3. [POO] appeler une methode de classe dans une fonction
    Par ryykko dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/02/2008, 22h10
  4. Type de paramètre dans une fonction
    Par preempalver dans le forum Flash
    Réponses: 1
    Dernier message: 22/11/2007, 14h06
  5. Passage d'un textarea dans une fonction
    Par fffonck dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/08/2007, 17h00

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