- PR -

項目名の文字列とインテリセンスと列挙体

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-01 11:43
各フィールドごとのデータを扱う場合、よく項目名をインデックスにする方法を見かけ
ます。
そこで、文字列を毎回渡すと入力ミスがバグの元になるので、現在列挙体を使っている
訳です。

コード:
private enum FieldsEnum { 番号, 名称, 単価, 単位 }

private DataTable LoadData(string sqlText) {
    using (OleDbDataReader rd = this.Db.ReaderGet(sqlText)) {
        if (!rd.Read()) {
            return null;
        }
        DataTable d = new DataTable();
        d.Add(FieldEnum.番号.ToString(), (int)rd[FieldEnum.番号.ToString());
        d.Add(FieldEnum.名称.ToString(), rd[FieldEnum.名称.ToString()]);
        d.Add(FieldEnum.単価.ToString(), (int)rd[FieldEnum.単価.ToString()]);
        d.Add(FieldEnum.単位.ToString(), rd[FieldEnum.単位.ToString()].ToString());
        rd.Close();
        return d;
    }
}



これでバグの発見が楽になります。しかし、ToString() がちょっと邪魔くさいのです。
そこで、次のようにしてみました。

コード:
private class FieldsEnum {
    public static string 番号 { get { return "番号"; } }
    public static string 名称 { get { return "単価"; } }
    public static string 単位 { get { return "単位"; } }
}

private DataTable LoadData(string sqlText) {
    using (OleDbDataReader rd = this.Db.ReaderGet(sqlText)) {
        if (!rd.Read()) {
            return null;
        }
        DataTable d = new DataTable();
        d.Add(FieldEnum.番号, (int)rd[FieldEnum.番号);
        d.Add(FieldEnum.名称, rd[FieldEnum.名称].ToString());
        d.Add(FieldEnum.単価, (int)rd[FieldEnum.単価]);
        d.Add(FieldEnum.単位, rd[FieldEnum.単位].ToString());
        rd.Close();
        return d;
    }
}



すっきりしますが、FieldEnum クラスのプロパティ定義で、以下の様に "番号" を2
つ書くことになってしまいます。

public static string 番号 { get { return "番号"; } }

これくらい注意して書け、と言われればそれまでですが、できれば「番号」の文字列
を一つ書いただけで上記と同じ役割をしてくれるような良い方法があったら知りたい
のです。
取り扱う項目の量が結構多いので、できれば今後も簡潔に書けると良いなぁ、などと
都合の良いことを考えてしまいます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-01 12:33
引用:

R・田中一郎さんの書き込み (2006-04-01 11:43) より:

しかし、ToString() がちょっと邪魔くさいのです。


ToString メソッドの結果、何を取得したいと思っていますか?
列挙体のメンバの名前ですか?
何のために取得したいと思っていますか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-01 13:12
引用:

R・田中一郎さんの書き込み (2006-04-01 13:11) より:
引用:

じゃんぬねっとさんの書き込み (2006-04-01 12:33) より:

ToString メソッドの結果、何を取得したいと思っていますか?
列挙体のメンバの名前ですか?



そうです。文字列だけ必要です。
今の構成でいくと、列挙体の数値を利用することはありません。(今のところは)

引用:

じゃんぬねっとさんの書き込み (2006-04-01 12:33) より:

何のために取得したいと思っていますか?



こういうのを防ぎたいのです。

コード:
d["あいうえお"] = 0;
while (d["あいうえお"] < 10) {
    d["あいうえ"]++;
}



#土・日にじゃんぬねっとさんを見かけると、ちょっと嬉しい。


Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-04-01 14:16
型指定されたDataSetじゃ駄目ですか?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-01 15:55
引用:

Kazukiさんの書き込み (2006-04-01 14:16) より:

型指定されたDataSetじゃ駄目ですか?



DataSet って使ったことが無いんですが、どんな感じになるんでしょう?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-01 16:09
引用:

R・田中一郎さんの書き込み (2006-04-01 15:55) より:

DataSet って使ったことが無いんですが、どんな感じになるんでしょう?


メンバとしてフィールド名が出せるような感じです。
新しい項目の追加から試してみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-01 19:55
DataSet について色々調べて、実際に使ってみたのですが、データ値を Hashtable
に一時的に格納するためのキーにする場合は、どのようになるのでしょう?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-02 10:10
引用:

R・田中一郎さんの書き込み (2006-04-01 19:55) より:

DataSet について色々調べて、実際に使ってみたのですが、データ値を Hashtable
に一時的に格納するためのキーにする場合は、どのようになるのでしょう?


何故ここでいきなり HashTable が出てきたのでしょうか?
列挙体でない方の田中さんの実装だとどうするつもりだったんですか?
列挙体を使用しない以上は別途必要でしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)