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 :

[c#][Reflexion] Obtenir le type d'un generic


Sujet :

Windows Forms

  1. #1
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut [c#][Reflexion] Obtenir le type d'un generic
    Salut, jai ce petit bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CouponsEntity = new DataTable("Coupons");
     
    foreach (PropertyInfo propertyInfo in typeof(Business.Model.ICoupon).GetProperties())
    {
    	Type type = propertyInfo.PropertyType;
     
    	if (type.FullName.IndexOf(typeof(Nullable).FullName) != -1)
    		type = type.GetGenericArguments()[0];
     
    	CouponsEntity.Columns.Add(propertyInfo.Name, type);
    }
    Je voudrais savoir si qqn sait comment obtenir le type d'un generic (nullable, list etc)

    J'ai utiliser ce bout de code pour l'obtenir mais je trouve pas cela très propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (type.FullName.IndexOf(typeof(Nullable).FullName) != -1)
    merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Novembre 2002
    Messages : 89
    Points : 108
    Points
    108

  3. #3
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Salut bootix, voila ce que ca me retourne
    +type.GetGenericTypeDefinition() {Name = "Nullable`1" FullName = "System.Nullable`1"} System.Type {System.RuntimeType}
    .NET génère une class au runtime pour chaque Nullable, donc il la nomme Nullable`1. Jai essaye de trouvé une propriété qui me retourne seulement Nullable mais jai rien trouvé

  4. #4
    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
    J'ai pas testé car je peux pas pour le moment mais en étant logique:

    Type t = typeof(Nullable)


    me semble bien.


    Pkoi, il est où ton prob ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Novembre 2002
    Messages : 89
    Points : 108
    Points
    108
    Par défaut
    D'accord avec Morpheus, il doit te retourner un objet Type que tu peux comparer via un typeof avec typeof(Nullable), qu'est ce qui cloche?

  6. #6
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Vous semblez ne pas comprendre. Je n'est pas vraiment de problème c'est juste que je trouve ma facon de trouvé un nullable très mal propre.

    Si je comprend bien, vous voulez que je fasse se test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Type type = propertyInfo.PropertyType;
    if (type == typeof(Nullable)) ...
    cependa, type n'est pas du type Nullable mais bien du type
    {Name = "Nullable`1" FullName = "System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"} System.Type {System.RuntimeType}
    Donc impossible de savoir si ma variable est un Generic de type nullable ou list<>. C'est exactement ce que je cherche a savoir avec cette ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (type.FullName.IndexOf(typeof(Nullable).FullName) != -1)
    Si le fullname contient nullable alors je considère que c'est un nullable sauf que c'est très mal propre.

    Voila

    [edit]
    J'ai trouver ceci pour savoir si mon type est de type nullable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (Nullable.GetUnderlyingType(type) != null)
    Mais même encore la, je ne sais pas si mon type est une list<> par exemple! Je sais que c'est un generic mais je veux savoir quel est le type
    [/edit]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Novembre 2002
    Messages : 89
    Points : 108
    Points
    108
    Par défaut
    Je dois avoir manqué quelques chose, je comprends toujours pas ce que tu cherches à extraire comme info (type, contraite, type sous jacent...), quoiqu'il en soit voilà un lien dans lequel sont exposés des manipulations de type et de contraintes sur type :
    http://msdn2.microsoft.com/fr-fr/library/b8ytshk6.aspx
    Je pense que tu trouveras ce qu'il te faut.

  8. #8
    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
    A tout hasard, tu as testé un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Type type = propertyInfo.PropertyType;
     
    if (type is Nullable)
    {
       //
     
    }
    ?

  9. #9
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Citation Envoyé par Morpheus
    A tout hasard, tu as testé un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Type type = propertyInfo.PropertyType;
     
    if (type is Nullable)
    {
       //
     
    }
    ?

    Je n'est pas tester mais je vais tester lundi matin a mon bureau.

  10. #10
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Je suis de retour au travail et j'ai essayer ta méthode morpheus et ca ne fonctionne pas, j'ai du utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (Nullable.GetUnderlyingType(type) != null) //Detect nullity
    @Bootix, je vais te réexpliquer. Imagine que dans ma réflection, jai des type generic, et je veux savoir de quel type est ce generic (Nullable, list<> etc).
    J'aimerais avoir une méthode avec la réflection que tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type.GetGenericType()
    Et que cela te retourne List<> par exemple

    J'ai essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type.GetGenericTypeDefinition()
    Mais cela retourne
    +type.GetGenericTypeDefinition() {Name = "Nullable`1" FullName = "System.Nullable`1"} System.Type {System.RuntimeType}
    J'ai bien le name qui est Nullable mais il y a cette petite `1 à la fin, je cherche une propriété qui me retourne seulement Nullable (sans la `1)

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Novembre 2002
    Messages : 89
    Points : 108
    Points
    108
    Par défaut
    Ah ok, effectivement ce 1 represente le nombre de types qu'englobe le generique
    si tu as un truc genre List<int?,bool?> il te donnera "Nullable '2" si je ne dis pas de betise.

    Et effectivement je ne connais pas non plus de methode capable de renvoyer le type sans cette precision derangeante... Si tu trouves une solution elegante je suis preneur :-)

  12. #12
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Citation Envoyé par bootix
    Ah ok, effectivement ce 1 represente le nombre de type qu'englobe le generique
    si tu as un truc genre List<int?,bool?> il te donnera "Nullable '2" si je ne dis pas de betise.

    Et effectivement je ne connais pas non plus de methode capable de renvoyer le type sans cette precision derangeante... Si tu trouve une solution elegante je suis preneur :-)
    Dac, je te la donnerai si jamais je la trouve, mais pour linstant, j'ai dautre chats à fouettés donc ca va attendre.

    Enfin tu as compris

  13. #13
    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
    Citation Envoyé par shwin
    Je suis de retour au travail et j'ai essayer ta méthode morpheus et ca ne fonctionne pas, j'ai du utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (Nullable.GetUnderlyingType(type) != null) //Detect nullity
    Oui, il est possible que ma méthode ne fonctionne pas: je t'ai donné l'algo de base mais je n'ai pas testé le code

    Enfin, apparement, ton pb est réglé ?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/07/2008, 13h36
  2. Reflexion : obtenir un membre privé.
    Par maa dans le forum C#
    Réponses: 3
    Dernier message: 07/12/2007, 21h06
  3. Réponses: 7
    Dernier message: 22/02/2007, 16h57
  4. [IB] Obtenir le type d'un champ
    Par chant78 dans le forum SQL
    Réponses: 6
    Dernier message: 02/10/2006, 17h06
  5. [VB.NET]Comment obtenir un type à partir d'un string?
    Par NicolasJolet dans le forum VB.NET
    Réponses: 2
    Dernier message: 24/02/2006, 15h46

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