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 :

Type variable non connu à la compilation


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 106
    Points : 56
    Points
    56
    Par défaut Type variable non connu à la compilation
    Bon, je me retrouve face à plein de problèmes aujourd'hui... J'arrive à en résoudre la plupart en les contournant, bien que ce soit moins sympa, mais certains subsistent, dont celui-ci :Comment utiliser un type qu'on ne connait pas à la compilation?

    structure est un tableau d'objets qui possedent une variable Type de type Type (comme Champ), donc stocke un type.

    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
     
     
    Type t = (structure[num].Type);
    champs.Add(nom, (object)new Champ<t>(nom));
     
    ...
     
        public class Champ<T>
        {
            public Type Type = typeof(T);
     
            public string Nom;
            public Champ(nom) { Nom = nom ; }
     
            ....
        }
    Le problème est que pour créer l'objet Champ, je dois en connaitre le type, mais celui-ci n'est pas connu à la compilation.

    Le compilateur n'est pas content :
    Erreur 1 : Le type ou le nom d'espace de noms 't' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)


    Est-il possible de résoudre l'erreur? Ou dois-je me résigner à oublier le type ?
    (j'ai bien entendu énormément raccourci pr la lisibilité, il y a une boucle traitant plusieurs objets, etc...)

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    dans ton cas, tu ne peux utiliser les generics, le type de ce dernier devant etre fermé à la compilation (pas de generics runtime en bref). Pour ton probleme, pas vraiment besoin de generics, si c'est pour juste assigné un champ de type Type, passe le en parametre normalement.

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    (pas de generics runtime en bref)
    Faux, c'est tout à fait possible. Par contre, ce n'est pas aussi simple.
    Il faut utiliser la Reflection avec la méthode Type.MakeGenericType.
    Des exemples sont disponibles sur cette page je vais donc pas m'étendre sur le sujet (étant un peut préssé aussi ) mais normalement tu devrais t'en sortir...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    My bad, j'avais oublié celui la =(

    Donc oui on peut utiliser des generics au runtime (rattrapage !), mais dans le cas, present, de toutes facons, je le passerai quand meme en parametre puisqu'on s'en sert comme variable et non comme type (enfin AMHA).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 106
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Salut,

    dans ton cas, tu ne peux utiliser les generics, le type de ce dernier devant etre fermé à la compilation (pas de generics runtime en bref). Pour ton probleme, pas vraiment besoin de generics, si c'est pour juste assigné un champ de type Type, passe le en parametre normalement.

    J'ai oublié, bien entendu dans ma classe champ, j'ai un get de type :
    T Value { get {return _Value;} }
    T _Value;

    C'est bien là où ça pose pb!

    Je vais aller jeter un coup d'oeil du coté de MakeGenericType voir ce que ça donne.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 106
    Points : 56
    Points
    56
    Par défaut


    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
     
      class St
      {
         string nom;
         Type type;
         public St(string nm, Type t) { nom = nm; type=t; }
      }
      class Champ<T>
      {
         T _Value;
         public T { get { return _Value; } }
     
         public Champ(T value) 
         {
            _Value = value; 
         }
      }
     
    class Test
    {
     
    public Test(St[] st, object[] objets)
    {
      St[] Sts = new St[3];
      Sts[0] = new St("nom1", typeof(Array) );
      Sts[1] = new St("nom2", typeof(bool) );
      Sts[2] = new St("nom3", typeof(int[]) );
     
      object[] obj = new object[3];
      object[0] = (object) new Array() {1, 2, 3};
      object[1] = (object) true;
      object[2] = (object) new int[] {1, 2, 3};
     
      List<object> resultat = Process(Sts, obj);
    }
     
    public Process (St[] st, object[] objets)
      Type t ;
      List<object> liste = new List<object>();
     
      for( int i = 0; i < 3; i++ )
      {
         t = (Sts[i].type);
         liste.Add( (object) new Champ<t>( (t) objets[i]) );
      }
    }
    Bon, je ne vois vraiment pas comment faire ça... L'exemple est complet il me semble. Pour ça j'ai toujours la même erreur : le compilateur ne connais pas l'espace de nom 't'... Si je lui mets this.t, c'est encore pire.

    Je ne vois pas trop comment me servir de MakeGenericType non plus... Enfin je ne pense pas que ça puisse résoudre mon pb! Si qq'un a une suggestion ?

  7. #7
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par jo_dalton Voir le message
    Je ne vois pas trop comment me servir de MakeGenericType non plus... Enfin je ne pense pas que ça puisse résoudre mon pb! Si qq'un a une suggestion ?
    Ben je pense que tu pourrai reprendre ton exemple, mais au lieu de faire Champ<t> qui est, une abomination () tu pourrai faire :
    Code c# : 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
     
            class Champ<T>
            {
                T _Value;
                public T myProp { get { return _Value; } }
     
                public Champ(T value)
                {
                    _Value = value;
                }
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                Type mType = typeof(Champ<>).MakeGenericType(typeof(System.Windows.Forms.Form));
                object obj = mType.GetConstructor(new Type[] { typeof(System.Windows.Forms.Form) }).Invoke(new object[] { this });
                MessageBox.Show(obj.ToString());
            }

Discussions similaires

  1. Context-root non connu à la compilation
    Par zulu251 dans le forum Flex
    Réponses: 0
    Dernier message: 17/04/2009, 10h47
  2. variable globale de type non prédéfini à la compilation
    Par Discovery dans le forum Débuter
    Réponses: 8
    Dernier message: 01/04/2009, 19h05
  3. erreur de compilation variable non defini
    Par nabelou1 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/01/2009, 16h43
  4. Réponses: 14
    Dernier message: 16/07/2008, 17h05
  5. [TP] Constantes typées et non typées, variables
    Par poppels dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 26/10/2005, 23h00

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