Questo oggetto è un tipo integrale. Posso ottenere il suo valore in meno di cinque righe di codice?

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

  •  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?

È stato utile?

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) { ... }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top