- PR -

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

投稿者投稿内容
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2006-04-02 13:18
引用:

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

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

これくらい注意して書け、と言われればそれまでですが、できれば「番号」の文字列
を一つ書いただけで上記と同じ役割をしてくれるような良い方法があったら知りたい
のです。
取り扱う項目の量が結構多いので、できれば今後も簡潔に書けると良いなぁ、などと
都合の良いことを考えてしまいます。

...


「番号」の文字列を一つ書いただけで上記のようなコードを書いてくれる
コードジェネレータを書けば良いのでは?

_________________
IEEE-CSDP 2004-2007
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-03 10:31
 「変数名」そのものを値として使いたい、という事ですね。
 確かに、DataRow のカラム名や HashTable のキーに文字列を使うとき、そのように思う事はありますね。他にも、
コード:
enum FieldValue
{
	Number = "番号",
	Name = "名称"
}


のように、列挙体の値として「文字列」を使用したいことがあります。(無理ですが)

引用:

できれば「番号」の文字列 を一つ書いただけで上記と同じ役割をしてくれるような良い方法があったら知りたい のです。


 しかしちょっと待って下さい。変数名と値が全く同じであるという前提があってもいいのでしょうか。私は、先の例では列挙体のフィールド名と実際の値を別の名前として定義しました。
 変数名を値そのものとして扱いたい、という状況に若干の違和感を感じるのです。どうでしょうか。

_________________
囚人のジレンマな日々
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-03 14:16
引用:

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

何故ここでいきなり HashTable が出てきたのでしょうか?



わかりにくくて申し訳ありません。スレ元のサンプルの DataTable を使って、Add()
メソッドを使っている部分で、項目名文字列をキーとして HashTable 的な処理をして
おります。

引用:

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

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



スレ元の2番目のサンプルですが、別途クラスを作って、プロパティで文
字列を返すようにと考えていました。

[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-04-03 14:16 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-03 14:17
引用:

iStationさんの書き込み (2006-04-02 13:18) より:

「番号」の文字列を一つ書いただけで上記のようなコードを書いてくれる
コードジェネレータを書けば良いのでは?




そうですね。
そうしようかなー。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-03 14:31
引用:

囚人さんの書き込み (2006-04-03 10:31) より:

 「変数名」そのものを値として使いたい、という事ですね。
 確かに、DataRow のカラム名や HashTable のキーに文字列を使うとき、そのように思



はい。文字列の入力ミスなどで、とんでもない動きをすることになるので、できる限り
変数に格納したものを使うようにしています。

引用:

囚人さんの書き込み (2006-04-03 10:31) より:

 しかしちょっと待って下さい。変数名と値が全く同じであるという前提があってもいいのでしょうか。私は、先の例では列挙体のフィールド名と実際の値を別の名前として定義しました。
 変数名を値そのものとして扱いたい、という状況に若干の違和感を感じるのです。どうでしょうか。



文字列をキーワードとして捕らえる場合なら、同じで良いという前提で良いように思
います。
使い方は、

grid.CurrentRow.Cells["品番"].Value = "A123";
grid.CurrentRow.Cells["品名"].Value = "こーひーかっぷ";
hashTable.Add("品番", grid.CurrentRow.Cells["品番"].Value);
hashTable.Add("品名", grid.CurrentRow.Cells["品名"].Value);



string 品番 = "品番";
string 品名 = "品名";

grid.CurrentRow.Cells[品番].Value = "A123";
grid.CurrentRow.Cells[品名].Value = "こーひーかっぷ";
hashTable.Add(品番, grid.CurrentRow.Cells[品番].Value);
hashTable.Add(品名, grid.CurrentRow.Cells[品名].Value);

な使い方のイメージです。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-03 14:42
Hashtable だけで述べれば、キーが文字列限定というわけではないので、
コード:
public enum HogeKey
{
    品番,
    品名
}


コード:
Hashtable hash = new Hashtable();
hash.Add( HogeKey.品番, "1" );
hash.Add( HogeKey.品名, "なまえ" );

string no = ( string )hash[ HogeKey.品番 ];
string name = ( string )hash[ HogeKey.品名 ];



という事で
コード:
grid.CurrentRow.Cells[HogeKey.品番.ToString()].Value = "A123"; 
grid.CurrentRow.Cells[HogeKey.品名.ToString()].Value = "こーひーかっぷ"; 
hashTable.Add(HogeKey.品番, grid.CurrentRow.Cells[HogeKey.品番.ToString()].Value); 
hashTable.Add(HogeKey.品名, grid.CurrentRow.Cells[HogeKey.品名.ToString()].Value); 


最初に田中さんが出した案もありですね。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-03 15:00
ToString() がイヤだという話じゃなかったでしたっけ? (; ̄- ̄)

それはそうと、定数を使おうと定義することで「コンパイル解決」できているわけではないですよね。
つまり「複数箇所で使う場合の考慮」という恩恵でしかないわけです。

この次元で考えるのであれば、2 回書くのは別に良いと思いますけどね。

コード:

    private class FieldsEnum {
        public const string 番号 = "番号";
        public const string 名称 = "名称";
        public const string 単位 = "単位";
    }


で、良いのではないでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-03 15:10
コード:
public string HogeFunc2( HogeKey key )
{
    return ( string )row[ key.ToString() ]; // row : DataRow
}


話は少し変わりますが、上記みたいな事ができるから、メソッドの引数が絡んでくる「場合」は便利ですな。
HogeFunc2() のクライアントは何を指定できるのかが明確。

ToString() 書くのも、2回書くのもそんなに嫌な事ではないと思うのですが。
_________________
囚人のジレンマな日々

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