Cet objet est un type intégral. Puis-je obtenir sa valeur en moins de cinq lignes de code?

StackOverflow https://stackoverflow.com/questions/631994

  •  08-07-2019
  •  | 
  •  

Question

J'ai un lecteur de données. Je veux comparer la valeur qu'il contient avec la valeur 42. Je sais que c'est un type intégral (par exemple, ce que MySQL appelle INT , TINYINT , SMALLINT , MEDIUMINT , BIGINT , JUMBODELUXEINT , etc.). Je ne veux pas connecter le type réel au code C #. Le meilleur que j'ai trouvé est

object x = reader.GetValue(i);
uint k = x is byte ? (byte) x
    : x is short ? (uint) (short) x
    : x is ushort ? (ushort) x
    : x is int ? (int) (int) x
    : (uint) x;
if (k == 42) { ... }

Cela semble incroyablement long. J'ai essayé d'utiliser est égal à , mais différents types d'intégraux avec la même valeur ne semblent pas être testés comme égaux.

Y a-t-il un meilleur moyen?

Était-ce utile?

La solution

Il suffit de vérifier Convert.ToUInt32 (objet) ... yup, ça marche très bien:

using System;

class Test
{
    static void Main()
    {
        Check((byte)10);
        Check((short)10);
        Check((ushort)10);
        Check((int)10);
        Check((uint)10);
    }

    static void Check(object o)
    {
        Console.WriteLine("Type {0} converted to UInt32: {1}",
                          o.GetType().Name, Convert.ToUInt32(o));
    }
}

En d'autres termes, votre code peut être:

object x = reader.GetValue(i);
uint k = Convert.ToUInt32(x);
if (k == 42) { ... }

Sinon, étant donné que tous les uint sont représentables en longueur, si vous utilisez un lecteur de données, pouvez-vous essayer reader.GetInt64 (i) ? Je ne sais pas si la conversion sera faite pour vous, mais cela vaut probablement la peine d'essayer.

Autres conseils

if(Convert.ToUInt32(reader.GetValue(i)) == 42) { ... }

Vous pouvez aussi faire les réponses de Skeet et Daniel à l’inverse, comme ceci:

if (k == Convert.ChangeType(42, k.GetType()) { ... }

Je ne l'ai pas encore testé.

Je ne suis pas sûr de bien vous comprendre, mais je pense que cela devrait fonctionner:

int x = int.Parse(reader.GetValue(i).ToString());
if(x == 42) { // do your logic }

Vous pouvez essayer ceci:

unit k = Convert.ToUInt32(x);

Cependant, vous seriez mieux servi pour renommer vos variables. Les variables à 1 lettre sont sooo la semaine dernière .

Cela devrait fonctionner:

object x = reader.GetValue(i);

uint k;
try
{
    k = Convert.ToUInt32(x);
}
catch(InvalidCastException e) { ... }
if (k == 42) { ... }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top