我正在编写数据库test utils代码,它将DataRow值与作为Dictionary提供的期望值进行比较(columnName,expectedColumnValue)。
它适用于许多类型,但对于字节和短,我必须添加转换代码,将值转换为Int32。
两个问题:
您是否了解如何更好地使用此代码,即如何避免转换? 对于decimal和float,它似乎工作,因为它们被显式声明为十进制/浮点值。 Long也可以毫无问题地工作。
如果没有其他方法,除了短片和字节之外还有其他类型我需要担心吗?
以下演示代码:
var table = new DataTable();
table.Columns.Add(new DataColumn("CarrierId", typeof(byte)));
table.Columns.Add(new DataColumn("NotationId", typeof(short)));
var row = table.NewRow();
row[0] = 5;
row[1] = 123;
table.Rows.Add(row);
var expected = new Dictionary<string, object>
{
{"CarrierId", 5},
{"NotationId", 123},
};
foreach (var entry in expected)
{
var value = row[entry.Key];
var expectedValue = entry.Value;
if (value is short || value is byte)
value = Convert.ToInt32(value);
Console.WriteLine();
Console.WriteLine(String.Format("Not converted: {0}", row[entry.Key].Equals(entry.Value)));
Console.WriteLine(String.Format("Converted (if applicable): {0}", value.Equals(expectedValue)));
}
答案 0 :(得分:3)
将预期类型的值添加到字典中,然后在比较时不再需要进行转换:
var expected = new Dictionary<string, object>
{
{ "CarrierId", (byte)5 },
{ "NotationId", (short)123 },
};
当您将由常量表达式(在编译时已知)给出的int
数字分配给byte
变量时,C#会自动将其转换为byte
。
byte b = 5; // Stores a byte
但是当您将其分配给object
变量时,C#不知道您将来会将其用作byte
,并默认将其威胁为int
。< / p>
object o = 5; // Stores an int
答案 1 :(得分:0)
除了Olivier Jacot-Descombes的回答,你可以试试这段代码:
object o = 5;
var v = o;
if (v is short)
MessageBox.Show("short");
else if (v is byte)
MessageBox.Show("byte");
else if (v is int)
MessageBox.Show("int");
每当您为integer
分配object
字面值时,它基本上都是整数,因此var
将为int
。因此,我建议您使用数据库中的类型转换而不是反之亦然。