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 :

[C#] comment manipuler des types inconnus ?


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Par défaut [C#] comment manipuler des types inconnus ?
    J'ai actuellement une application dans laquelle je manipule des chaînes d'expressions mathematiques.
    Je décompose ces chaînes en éléments simples ( variables, opérateurs, etc )

    Je souhaiterai disposer d'une enum des differents types disponibles, ainsi que d'une fonction qui me renverrai un type.

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public UnknownType trouverType( string MaVariable ){... return type;}
    public enum TypeMot
        {
            bool,int,float, ...
        }
    Comment peut on manipuler les types ? Je n'ai pas trouvé beaucoup de doc la dessus. Rien qu'une enum de type je n'arrive pas à le faire.

  2. #2
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Bonjour,

    Si j'ai bien compris, tu veux retourner un type en fonction de son nom sous forme de string ? dans ce cas, du peux essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected Type TrouverType(string maVariable)
    {
    	return Type.GetType(maVariable);
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Par défaut
    ok, je comprends bien ton exemple.
    J'aimerai pouvoir retourner un type, en fonction de la chaîne dont je dispose.
    si ma chaîne contient un entier, je retourne int etc.

    Pour ce qui est de tester la chaîne, ca je peux me débrouiller. Mais puis-je faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected Type TrouverType(string maVariable)
    {
    if( IsInt(maVariable) ) return Type.int;
    }
    où IsInt() ferait le traitement de chaîne qui va bien pour savoir si c'est bien un int.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par clinic

  5. #5
    Membre chevronné
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Par défaut
    Si tu fournis une String en entrée, tu n'as aucune chance de trouver le VRAI type d'origine. En effet, si tu as maVariable = "1", les méthodes Int32.Parse(), Int64.Parse(), Decimal.Parse(), etc... vont toutes fonctionner, mais quel type vas-tu choisir ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Par défaut
    Citation Envoyé par Astartee
    Ok, je note la syntaxe.
    Merci

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par BCmDev
    Si tu fournis une String en entrée, tu n'as aucune chance de trouver le VRAI type d'origine. En effet, si tu as maVariable = "1", les méthodes Int32.Parse(), Int64.Parse(), Decimal.Parse(), etc... vont toutes fonctionner, mais quel type vas-tu choisir ?
    Dans ce cas, il s'agira d'une approche de type 'Best Effort'. Mais sans information autre que la valeur, il serait peut-être judicieux de tout mettre en Decimal pour les types numériques.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  8. #8
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    OK je comprends ce que tu veux faire. Tu veux retourner le type en fonction d'une valeur passée en paramètre sous forme de string ? genre faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type type = GetType("23"); // retourne un type Int32
    Type type2 = GetType("false"); // retourne un type booléen
    Dans ce cas, il faut que tu teste à chaque fois ta chaine de caractère en entrée pour tenter de la caster dans un des types :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	private Type GetType(string maVariable)
    	{
    		int typeInt;
    		if (int.TryParse(maVariable, out typeInt))
    			return typeof(Int32);
     
    		bool typeBool;
    		if (bool.TryParse(maVariable, out typeBool))
    			return typeof(bool);
     
     
    		return typeof(string);
    	}

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Par défaut
    Citation Envoyé par BCmDev
    Si tu fournis une String en entrée, tu n'as aucune chance de trouver le VRAI type d'origine. En effet, si tu as maVariable = "1", les méthodes Int32.Parse(), Int64.Parse(), Decimal.Parse(), etc... vont toutes fonctionner, mais quel type vas-tu choisir ?
    C'est tout à fait vrai, mais dans le cadre de mon application, je n'ai pas besoin de retrouver le VRAI type d'origine.
    Mais c'est vraiment important de souligner cela, tu as raison.
    Le simple fait de connaître le type le plus 'gourmand' ou 'complexe' de mon expression mathématique me suffit.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Par défaut
    Citation Envoyé par guitoux1
    OK je comprends ce que tu veux faire. Tu veux retourner le type en fonction d'une valeur passée en paramètre sous forme de string ? genre faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type type = GetType("23"); // retourne un type Int32
    Type type2 = GetType("false"); // retourne un type booléen
    Dans ce cas, il faut que tu teste à chaque fois ta chaine de caractère en entrée pour tenter de la caster dans un des types :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	private Type GetType(string maVariable)
    	{
    		int typeInt;
    		if (int.TryParse(maVariable, out typeInt))
    			return typeof(Int32);
     
    		bool typeBool;
    		if (bool.TryParse(maVariable, out typeBool))
    			return typeof(bool);
     
     
    		return typeof(string);
    	}
    Merci, je vais essayer de mettre cet exemple en oeuvre dans mon code, je te tiens au courant :-)

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par clinic
    C'est tout à fait vrai, mais dans le cadre de mon application, je n'ai pas besoin de retrouver le VRAI type d'origine.
    Mais c'est vraiment important de souligner cela, tu as raison.
    Le simple fait de connaître le type le plus 'gourmand' ou 'complexe' de mon expression mathématique me suffit.
    Dans ce cas, commence par tester les éléments les plus complexes, comme le datetime, et termine par les plus génériques, int, et enfin string.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

Discussions similaires

  1. Comment manipuler des instance de type Date java.sql
    Par mehdi_scofield dans le forum Langage
    Réponses: 3
    Dernier message: 29/10/2008, 16h15
  2. Comment Manipuler des objets dans une liste de type TList ?
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 1
    Dernier message: 02/11/2006, 15h40
  3. Réponses: 1
    Dernier message: 17/03/2006, 22h23
  4. [VB.Net] Comment comparer des types?
    Par smedini dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/01/2006, 12h00
  5. Traitement d'image, comment distinguer des types?
    Par inai dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 07/06/2005, 01h09

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