Questo oggetto è un tipo integrale. Posso ottenere il suo valore in meno di cinque righe di codice?
-
08-07-2019 - |
Domanda
Ho un lettore di dati. Voglio confrontare il valore in esso con il valore 42. So che è un tipo integrale (ad esempio, ciò che MySQL chiama INT
, TINYINT
, SMALLINT ,
MEDIUMINT
, BIGINT
, JUMBODELUXEINT
, ecc.). Non voglio collegare il tipo attuale al codice C #. Il migliore che ho ideato è
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) { ... }
Sembra incredibilmente prolisso. Ho provato a usare Equals
ma diversi tipi integrali con lo stesso valore non sembrano testare uguali.
C'è un modo migliore?
Soluzione
Basta controllare Convert.ToUInt32 (object)
... sì, funziona benissimo:
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));
}
}
In altre parole, il tuo codice può essere:
object x = reader.GetValue(i);
uint k = Convert.ToUInt32(x);
if (k == 42) { ... }
In alternativa, dato che tutti i uint
sono rappresentabili come long, se stai usando un lettore di dati potresti provare reader.GetInt64 (i)
? Non so con certezza se la conversione verrà eseguita per te, ma probabilmente vale la pena provare.
Altri suggerimenti
if(Convert.ToUInt32(reader.GetValue(i)) == 42) { ... }
Puoi anche fare le risposte di Skeet e Daniel al contrario in questo modo:
if (k == Convert.ChangeType(42, k.GetType()) { ... }
Non l'ho ancora testato.
Non sono sicuro di averti capito correttamente, ma penso che dovrebbe funzionare:
int x = int.Parse(reader.GetValue(i).ToString());
if(x == 42) { // do your logic }
Puoi provare questo:
unit k = Convert.ToUInt32(x);
Sarebbe meglio servirti rinominando le tue variabili, comunque. Le variabili da 1 lettera sono sooo la scorsa settimana .
Questo dovrebbe funzionare:
object x = reader.GetValue(i);
uint k;
try
{
k = Convert.ToUInt32(x);
}
catch(InvalidCastException e) { ... }
if (k == 42) { ... }