このオブジェクトは整数型です。 5行未満のコードでその値を取得できますか?
-
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) { ... }
所属していません StackOverflow