0

DataRow 値をディクショナリ (columnName、expectedColumnValue) として提供される期待値と比較するデータベース テスト ユーティリティ コードを作成しています。

多くの型で問題なく動作しますが、byte と short の場合、値を Int32 に変換する変換コードを追加する必要がありました。

2 つの質問:

  1. このコードをより良くする方法、つまり変換を回避する方法についてのアイデアはありますか? decimal と float の場合、decimal/float 値として明示的に宣言されているため、機能しているようです。ロングも問題なく動作します。

  2. 他に方法がない場合、short と byte 以外に心配する必要がある型はありますか?

以下のデモコード:

            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# はそれを将来 として使用することを認識せず、デフォルトbyteで として脅威を与えます。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リテラルをに割り当てるときはいつでも、objectそれは本質的にintであるため、varになりますint。したがって、データベースから型へのキャストを使用することをお勧めします。その逆ではありません。

于 2012-10-26T21:18:16.550 に答える