Этот объект является целочисленным типом. Могу ли я получить его значение менее чем в пяти строках кода? - PullRequest
4 голосов
/ 10 марта 2009

У меня есть считыватель данных. Я хочу сравнить значение в нем со значением 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, но разные целочисленные типы с одинаковым значением не выглядят одинаковыми.

Есть ли лучший способ?

Ответы [ 6 ]

9 голосов
/ 10 марта 2009

Просто проверяю Convert.ToUInt32(object) ... да, все работает нормально:

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 представимы как длинные, если вы используете устройство для чтения данных, вы можете попробовать reader.GetInt64(i)? Я не знаю, будет ли конвертация сделана для вас, но, вероятно, стоит попробовать.

6 голосов
/ 10 марта 2009
if(Convert.ToUInt32(reader.GetValue(i)) == 42) { ... }
2 голосов
/ 10 марта 2009

Вы также можете сделать ответы Скита и Даниэля в обратном порядке, как это:

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

Я еще не проверял это.

0 голосов
/ 10 марта 2009

Это должно работать:

object x = reader.GetValue(i);

uint k;
try
{
    k = Convert.ToUInt32(x);
}
catch(InvalidCastException e) { ... }
if (k == 42) { ... }
0 голосов
/ 10 марта 2009

Вы можете попробовать это:

unit k = Convert.ToUInt32(x);

Хотя вам лучше переименовать переменные. Переменные, состоящие из 1 буквы: sooo на прошлой неделе .

0 голосов
/ 10 марта 2009

Я не уверен, правильно ли я вас понимаю, но думаю, что это должно сработать:

int x = int.Parse(reader.GetValue(i).ToString());
if(x == 42) { // do your logic }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...