0

我正在编写数据库测试实用程序代码,它将 DataRow 值与作为字典提供的预期值(columnName,expectedColumnValue)进行比较。

它适用于许多类型,但对于字节和短,我必须添加将值转换为 Int32 的转换代码。

两个问题:

  1. 你有想法如何使这段代码更好,即如何避免转换?对于小数和浮点数,它似乎可以工作,因为它们被明确声明为小数/浮点值。Long 也可以正常工作。

  2. 如果没有其他方法,除了短和字节之外还有其他类型我需要担心吗?

演示代码如下:

            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)));

            }
4

2 回答 2

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# 并不知道您将来会将其用作 abyte并且默认情况下会威胁它int

object o = 5; // Stores an int
于 2012-10-26T20:59:32.157 回答
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文字分配给 an 时,object它本质上是 int ,因此var将是int。因此,我建议您使用从数据库转换为类型的方法,反之亦然。

于 2012-10-26T21:18:16.550 回答