Este objecto é um tipo integral. Posso obter o seu valor em menos de cinco linhas de código?

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

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu tenho um leitor de dados. Eu quero comparar o valor com o valor 42. Sei que é um tipo integral (por exemplo, o MySQL chama INT, TINYINT, SMALLINT, MEDIUMINT, BIGINT, JUMBODELUXEINT, etc.). Eu não quero hardwire o tipo real para o código C #. O melhor que eu vim com é

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) { ... }

Isto parece incrivelmente prolixo. Eu tentei usar Equals mas diferentes tipos integrais com o mesmo valor não parecem teste como iguais.

Existe uma maneira melhor?

Foi útil?

Solução

Apenas verificação Convert.ToUInt32(object) ... sim, ele funciona muito bem:

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));
    }
}

Em outras palavras, o código pode ser:

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

Como alternativa, dado que todos os uints são representável como longs, se você estiver usando um leitor de dados você pode tentar reader.GetInt64(i)? Eu não sei offhand se a conversão será feita para você, mas é provavelmente uma tentativa vale a pena.

Outras dicas

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

Você também pode fazer as respostas de Skeet e Daniel em sentido inverso como esta:

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

Eu não testei-lo embora.

Eu não tenho certeza se eu entendi corretamente, mas acho que isso deve funcionar:

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

Você pode tentar o seguinte:

unit k = Convert.ToUInt32(x);

Você seria melhor servido renomear suas variáveis, no entanto. 1 variáveis ??carta são sooo na semana passada .

Isso deve funcionar:

object x = reader.GetValue(i);

uint k;
try
{
    k = Convert.ToUInt32(x);
}
catch(InvalidCastException e) { ... }
if (k == 42) { ... }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top