C# 此对象是整型对象。我能在少于五行的代码中得到它的值吗?
我有一个数据阅读器。我想将其中的值与值42进行比较。我知道它是一个完整的类型(例如,MySQL称之为C# 此对象是整型对象。我能在少于五行的代码中得到它的值吗?,c#,type-conversion,C#,Type Conversion,我有一个数据阅读器。我想将其中的值与值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
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
,但具有相同值的不同积分类型似乎无法测试为相等
有更好的方法吗?只是检查一下。。。是的,很好用:
if(Convert.ToUInt32(reader.GetValue(i)) == 42) { ... }
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
s都可以表示为long,如果您使用的是数据读取器,您可以尝试reader.GetInt64(i)
?我不知道是否会为您进行转换,但可能值得一试。我不确定是否正确理解您的意思,但我认为这应该可以:
int x = int.Parse(reader.GetValue(i).ToString());
if(x == 42) { // do your logic }
object x = reader.GetValue(i);
uint k;
try
{
k = Convert.ToUInt32(x);
}
catch(InvalidCastException e) { ... }
if (k == 42) { ... }
你也可以做双向飞碟和丹尼尔的回答,像这样:
if (k == Convert.ChangeType(42, k.GetType()) { ... }
我还没有测试过它。你可以试试这个:
unit k = Convert.ToUInt32(x);
不过,重命名变量会更好。上周有1个字母的变量。这应该可以:
int x = int.Parse(reader.GetValue(i).ToString());
if(x == 42) { // do your logic }
object x = reader.GetValue(i);
uint k;
try
{
k = Convert.ToUInt32(x);
}
catch(InvalidCastException e) { ... }
if (k == 42) { ... }
整数还是整数?使用
uint k=x是uint?(uint)x:(uint)转换为32(x))代码>。请看Jon Skeet回答中的哪一个解释。将某个东西转换为字符串并返回似乎是一种非常丑陋的简单数字转换方式,我同意!虽然我不知道Convert.ToX是如何工作的,但我曾经认为它必须首先将其转换为字符串。+1只是因为我是房间里的怪胎,必须反其道而行之!:)这不是真正的代码,如果C#对相互比较数字不敏感,那么根本不需要变量名!这是使用静态类型语言所付出的代价。尼尔·福特称之为“官僚主义”。插入-10
而不是10
,然后观察发生了什么。看见