このオブジェクトは整数型です。 5行未満のコードでその値を取得できますか?

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

次のように、スキートとダニエルの答えを逆に行うこともできます。

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文字の変数は先週すっごくです。

これは動作するはずです:

object x = reader.GetValue(i);

uint k;
try
{
    k = Convert.ToUInt32(x);
}
catch(InvalidCastException e) { ... }
if (k == 42) { ... }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top