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 obtenir le type "d'origine" d'un System.RuntimeType ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut comment obtenir le type "d'origine" d'un System.RuntimeType ?
    Bonjour,
    J'ai une méthode log qui attend d'être appelée de la manière suivante par la méthode toto (nom) :
    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
    public static void toto(ref decimal? limit, ref string code)
    {
    log("limit", typeof(decimal?), "code", typeof(string));
    ...
    }
    public static int log(params object[] parameters)
    {
        if ( (parameters[i].GetType() != typeof(string)) ||
            !(parameters[i + 1] is Type))
        {
            return 0;
        }
        else
        {
            if (parameters[i + 1].GetType() == typeof(decimal?))
            {
                ....
            }
            else if (parameters[i + 1].GetType() == typeof(string))
            {
                ....
            }
            ....
        }
        return ... ;
    }
    Le problème est que mes tests ne fonctionnent pas car le type d'un typeof n'est pas un System.Type mais un System.RuntimeType
    Quand je regarde la valeur du premier parameters[i + 1].ToString(), j'obtiens "System.Nullable`1[System.Decimal]", il doit donc bien y avoir moyen d'obtenir le "sous-type" de parameters[i + 1] d'une meilleur manière qu'aller regarder si le tostring() contient System.Decimal ou System.String, etc... Mais je ne sais pas comment. Est-ce que vous pouvez m'aider s'il vous plaît ?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour

    D'abord System.RuntimeType n'est pas une classe publique, et de plus dérive de System.Type.

    Sinon, je ne comprends pas trop ton problème.

    En effet, ce type de test fonctionne parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			string s = "x";
    			Type t1 = typeof(string );
    			Type t2 = s.GetType();
    			bool ok = t1 == t2;
    ok est toujours à "true".

    Sinon, tu as aussi une solution très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parameters[i].GetType().FullName != typeof(string).FullName
    Par ailleurs, tester directement des trucs du type Nullable<decimal> (i.e. decimal?) me semble une idée assez douteuse.

    Mieux vaut tester le type sousjacent quand tu reçois un Nullable<X>, car je ne pense pas que tu traite fondamentalement différement un Nullable<decimal> d'un decimal.

    Peut on connaitre l'objectif fonctionnel ici ? pourquoi ne passes tu pas plutot par des méthodes génériques ?

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Ce n'est pas parameters[i] qui me pose problème, mais parameters[i+1], et ici, parameters[i+1].GetType().FullName = "System.RuntimeType". Et je voudrais savoir quel est le type sous-jacent, à savoir System.Decimal nullable.
    Le bout de test que tu mets en exemple n'est pas ce qui me pose problème, on peut voir par contre que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string str = string.Empty;
    Type strType = str.GetType();
    Type strTypeType = strType.GetType();
    strType.ToString();     // returns "System.string"
    strTypeType.ToString(); // returns "System.RuntimeType"
    Moi j'ai besoin de savoir comment détecter le type "sous" strTypeType, à savoir "System.string"

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Ton problème vient du fait que tu appelle GetType sur une varable de type Type; donc tu récupére le type de la variable qui contient le Type, au lieu du contenu de la variable (qui lui est le type).

    Cela revient à écrire :

    typeof(decimal).GetType();

    cf. exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		static void Main()
    		{		
    			Console.WriteLine(typeof(decimal?).GetType().FullName);
    			Console.WriteLine(typeof(decimal?).FullName);
    			Console.ReadKey();
    		}

    Le test pour ce ca slà peut se faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    			if (o.GetType().FullName == "System.RuntimeType")
    			{
    				string typeFullName = (o as Type).FullName;
    				Console.WriteLine(typeFullName);
    			}
    			else
    				Console.WriteLine(o.GetType().FullName);

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    C'est bien ce que je veux faire.
    Par contre, je veux pouvoir le comparer par la suite à des typeof(decimal?), typeof(decimal), typeof(string), typeof(int?), typeof(int), etc...
    Et quand je fais ce que tu préconises : (parameters[i + 1] as Type).FullName, j'obtiens un type string contenant "System.Nullable`1[[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Oh, je viens de voir que typeof(decimal?).FullName = "System.Nullable`1[[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]", soit la même chaîne. Donc je peux effectivement comparer ces 2 strings j'imagine.
    Merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/11/2007, 18h09
  2. [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
  3. [cr 8.5] comment exploiter les données d'un "array"
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 12
    Dernier message: 09/06/2005, 14h03
  4. Réponses: 2
    Dernier message: 30/08/2004, 14h48

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