该对象是整数类型。我可以用少于五行代码获得它的价值吗?

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

  •  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(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 都可以表示为long,如果您使用数据读取器,可以尝试 reader.GetInt64(i)?我不知道是否会为你完成转换,但它可能值得一试。

其他提示

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

你也可以反过来做Skeet和Daniel的答案:

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) { ... }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top