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 :

Comment convertir un type vers un autre?


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut Comment convertir un type vers un autre?
    Comment faire pour essayer de transformer un objet en un autre type, j'ai l'erreur suivante : value ne peut pas etre convertie en T, je voudrai que le code essaye...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private T StringToType<T>(string value)
        {
            try
            {
                T data = value;
                return data;
            }
            catch (System.Exception)
            {
                return default(T);
            }
        }

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    J peux me tromper, mais j'ai l'impression que ce que tu cherches à faire s'appel de la réflexion. Cad instancier un object à partir du nom du type de l'object. En gros si je donne "MaClasse" en paramètre de ta méthode, alors tu veux avoir un object de type MaClasse en retour.

    C'est bien de cela que l'on parle ?

    J@ck.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    Oui ça pourrait bien faire l'affaire en effet. Rien que de m'avoir donner ce nom "reflexion" va certainement m'être très utile, google est mon ami, si tu as un ptit exemple de code simple je suis preneur. Dans tout les cas merci à toi.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    Ce que je cherche à faire, je vais vous le poster car j'aimerai avoir votre avis pour partir sur la bonne voie.
    Une des solutions qui me parraissait impecable (et que j'avais entierement codé...) était d'utiliser un dictionary de type <string,dynamic> mais ce n'est pas disponible dans la version de C# que j'utilise ( pour Unity ).

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Qu'est-ce que tu cherches à faire exactement?

    J'ai plutôt l'impression que tu cherches à faire un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Date test = StringToType<Date>("13/11/2011");
    Un TryCast quoi.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    Pour le moment mon code fonctionne mais il n'est pas très extensible, j'aimerai le généraliser en fesant ceci : Attention je sais que ceci est impossible, c'est juste pour comprendre ou je veux en venir.

    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
    public class QuiNeMarcheraJamais
    {
        MyVars[];
        public void main()
        {
     
            List<systemeType> typeListe = { string, bool, maclass };
     
            foreach (var _systemType in typeListe)
            {
                MonBouton bt = new MonBouton(onButtonClick);
                bt.type = _systemType;
     
            }
        }
     
     
        onButtonClick(Monbouton bt)
        {
            MyVars.Add(createInstance(bt.type));
        }
    }
    Pour l'instant, j'ai un dictionary qui gere ou placer les données en fonction du nom et du type, MesTypes est de type enum :
    dictionary<MesTypes<dictionary<string,int>
    Puis une liste<type> pour chaque type de variable que je veux utiliser,
    Puis :
    - quand je genere un nouveau data je ne lui donne pas de valeur car c'est plus simple. (Ca m'a évité de taper 25 surcharges que de toute façon il faudra dans SetValue)
    - quand je veux set une valeur je passe en argument le type enum qui represente la liste des types implemantés, le nom de la variable et la valeur, ceci sous x surcharge...
    - pour le get c'est pareil...

    C'est vraiment moche comme code, et le tout doit etre public puisque j'y accede a partir d'une autre classe qui genere ça... c'est affreux. Le pire c'est que pour ajouter un nouveau type de variable il faut gratter du code un peu partout... Je deteste mon code.

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par ChapsF Voir le message
    C'est vraiment moche comme code, et le tout doit etre public puisque j'y accede a partir d'une autre classe qui genere ça... c'est affreux. Le pire c'est que pour ajouter un nouveau type de variable il faut gratter du code un peu partout... Je deteste mon code.
    Pourrais-tu nous montrer ton code? Ça serait plus simple pour comprendre le problème.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    C'est pas que je veux ne pas vous le montrer c'est que c'est une usine à gaz en cours de modif...^^. Je post les fichiers puis vais poster quelques explications.Pièce jointe 314559

    DataSetManagerEditor.cs, ligne 271 se trouve l'appel à la fonction de creation de l'objet (dans un loop a travers l'enum qui stock ma liste de variable possible)

    Puis les fichier DataSet.cs et DataSetData.cs qui sont passé par tout et nimporte quoi comme code mais qui sont courts car j'ai tout viré^^.

    A la ligne 24 du fichier DataSetData, on peut voir ce que j'essaye de faire.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    Citation Envoyé par J@ckHerror Voir le message
    Bonjour,

    J peux me tromper, mais j'ai l'impression que ce que tu cherches à faire s'appel de la réflexion. Cad instancier un object à partir du nom du type de l'object. En gros si je donne "MaClasse" en paramètre de ta méthode, alors tu veux avoir un object de type MaClasse en retour.

    C'est bien de cela que l'on parle ?

    J@ck.
    En fait c'est exactement ce que je cherche à faire mais en plus de ça je doit garder un pointeur vers cette variable nouvellement généré dont le type m'est inconnu.

    Ma premiere question etait pour la création de l'objet, l'utilisateur entre un champ text, clique sur générer un int par exemple, et le code essaye de transformer le str en int , ce qui serait codable je pense^^, par contre impossible de transformer un str en MaClass qui n'implemente pas string donc : default(T).

    Mais J@ck à été plus loin dans ce que je cherche à faire... LOL

  10. #10
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Mouais ! ben moi j'ai rien compris à ce que tu voulais faire, et plus tu nous en donne moins je comprends !!!

    Faire de la réflexion n'est pas si anodin que ça ! Il peut être tout a fait justifié que tu veuilles en faire ... ok ! mais j'aimerais bien comprendre le but de ta fameuse usine à gaz, parce que là, à par pour faire un compilateur ou je sais pas trop peut être parce que tu veux créer une nouvelle syntaxe . Franchement je comprends pas ce que tu veux faire, mais encore moins l'intérêt...

    l'utilisateur entre un champ text, clique sur générer un int par exemple, [...] par contre impossible de transformer un str en MaClass qui n'implemente pas string donc : default(T).
    Yep ok ! mais pourquoi tu lui mets pas un bouton MaClasse, il clique et derrière le bouton tu fais un new MaClasse();, donc pas de saisie... pas de réflexion.
    Sinon tu as lu le lien ? peut etre que ce qu'il y a dedans de donnera des pistes.

    J@ck

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    Car l'utilisateur doit pourvoir ajouter SaClasse sans trop s'embeter.

    Je vais essayer d'expliquer les choses à plat avec du vrai code sans que vous ayez a vous coltiner le bordel fourni en piece jointe (post 8).

  12. #12
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Citation Envoyé par ChapsF Voir le message
    Car l'utilisateur doit pourvoir ajouter SaClasse sans trop s'embeter.
    Alors justement, ça veut dire quoi ? je vois deux possibilités, soit :

    1. l'utilisateur te fournit le code de cette nouvelle classe, donc tu veux l'instancier, donc tu veux faire un genre de compilateur
    2. soit l'utilisateur doit connaitre toutes les classes de ton projet, et le fait de mettre le nom d'une de ces class dans une TextBox lui permettra d'avoir ...

    pfff non franchement je sèche !
    Va falloir te décider à livrer le vrai but de ton projet

    De plus ton lien ne fonctionne pas.

    Bon code !
    J@ck.

  13. #13
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Je reviens sur la premier question puisque après je n'ai pas les facultés mentales nécessaire pour comprendre

    Si tu veux qu'il essaie de convertir
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private T StringToType<T>(string value)
    {
        try
        {
            return (T)(object)value;
        }
        catch (System.Exception)
        {
            return default(T);
        }
    }

  14. #14
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Citation Envoyé par ChapsF Voir le message
    Car l'utilisateur doit pourvoir ajouter SaClasse sans trop s'embeter.

    Je vais essayer d'expliquer les choses à plat avec du vrai code sans que vous ayez a vous coltiner le bordel fourni en piece jointe (post 8).
    Essai plutôt de nous expliquer clairement ce que tu souhaites faire, sans code, mais avec des exemples précis et détaillés, pas des moitiés d'exemple comme on a eu jusqu'à présent. Présente nous le contexte dans lequel tu te trouves, et le problème que tu cherches à résoudre. Seulement après cela, tu peux nous parler de la solution que tu essaies de mettre en place.

Discussions similaires

  1. Converter & tri dans un datagrid
    Par chrisdot dans le forum Silverlight
    Réponses: 1
    Dernier message: 21/05/2010, 12h11

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