Этот объект является целочисленным типом. Могу ли я получить его значение менее чем в пяти строках кода?
-
08-07-2019 - |
Вопрос
У меня есть читатель данных. Я хочу сравнить значение в нем со значением 42. Я знаю, что это целочисленный тип (например, то, что MySQL называет INT
, TINYINT
, SMALLINT
, MEDIUMINT
, BIGINT
, JUMBODELUXEINT
и т. д.). Я не хочу привязывать фактический тип к коду C #. Лучшее, что я придумал, это
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) { ... }
Это кажется невероятно многословным. Я попытался использовать Equals
, но разные целочисленные типы с одним и тем же значением не выглядят одинаково.
Есть ли лучший способ?
Решение
Просто проверяю Convert.ToUInt32 (объект)
... да, все работает нормально:
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));
}
}
Другими словами, ваш код может быть:
object x = reader.GetValue(i);
uint k = Convert.ToUInt32(x);
if (k == 42) { ... }
В качестве альтернативы, учитывая, что все uint
представимы в виде long, если вы используете устройство чтения данных, не могли бы вы попробовать reader.GetInt64 (i)
? Я не знаю, будет ли преобразование сделано для вас, но, вероятно, стоит попробовать.
Другие советы
if(Convert.ToUInt32(reader.GetValue(i)) == 42) { ... }
Вы также можете сделать ответы Скита и Даниэля в обратном порядке:
if (k == Convert.ChangeType(42, k.GetType()) { ... }
Я не проверял это все же.
Я не уверен, правильно ли я вас понимаю, но думаю, что это должно сработать:
int x = int.Parse(reader.GetValue(i).ToString());
if(x == 42) { // do your logic }
Вы можете попробовать это:
unit k = Convert.ToUInt32(x);
Хотя лучше переименовать переменные. Переменные, состоящие из 1 буквы: sooo на прошлой неделе .
Это должно работать:
object x = reader.GetValue(i);
uint k;
try
{
k = Convert.ToUInt32(x);
}
catch(InvalidCastException e) { ... }
if (k == 42) { ... }