@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

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

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-03 15:33
必殺リフレクション。

田中さんって VB 使いじゃなかったでしたっけ?
間違えてわざわざ苦手な VB で書いちゃいましたよ... orz

コード:

    Option Strict On

    Public Class BaseFieldEnum
        Public Sub New()
            Dim hType As Type = Me.GetType()
            Dim hFieldInfos As System.Reflection.FieldInfo() = hType.GetFields ( _
                System.Reflection.BindingFlags.GetField     Or _
                System.Reflection.BindingFlags.Public       Or _
                System.Reflection.BindingFlags.Instance     Or _
                System.Reflection.bindingflags.DeclaredOnly    _
            )

            For Each one As System.Reflection.FieldInfo In hFieldInfos
                one.SetValue(Me, one.Name)
            Next
        End Sub
    End Class

    Public NotInheritable Class ShohinMaster : Inherits BaseFieldEnum
        Public ReadOnly _
            商品コード, _
            商品名,     _
            単価,       _
            バラ単位    _
        As String
    End Class


これで ShohinMaster をインスタンス化すると...
まあ、なんてアスペクトなんでしょ。(;~_~)

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

囚人さんの書き込み (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.品名 ];





実は、今書いているコードの前は、数値を使っていたんです。
こんな感じです。

コード:
public enum HogeKey
{
    品番,
    品名
}



コード:
grid.CurrentRow.Cells[品番].Value = "A123"; 
grid.CurrentRow.Cells[品名].Value = "こーひーかっぷ"; 
arrayList.Add(grid.CurrentRow.Cells[品番].Value); 
arrayList.Add(grid.CurrentRow.Cells[品名].Value); 



しかし、業務管理系のシステムを使う場合は、やたらと同じ名前がでてくるので、
まとめて項目名定義用に Enum を統一したため、上記のやり方ができなくなってし
まったのです。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-03 15:40
引用:

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

ToString() 書くのも、2回書くのもそんなに嫌な事ではないと思うのですが。



そうですね。
利用する項目をまとめて定義したり、ToString() を大量に繰り返し入力したりする
と、何やらデータ入力している錯覚に襲われることに何か抵抗を感じているのかもし
れません。orz

昔、世の中が「プログラム作れる人=コンピューターを使える人」だった頃に、大量
のデータ入力・保守とシステム設計とプログラミングを兼任させられていた頃を思い
出します。(いつの時代の人だ?)

#ToString() って、よく () を忘れませんか?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-03 16:17
引用:

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

必殺リフレクション。



おおっ、これは凄いです。
僕が欲しかったものが実現してるじゃありませんか(T-T)
ありがとうございます。早速、中で何をやっているのか調べることにします。

引用:

じゃんぬねっとさんの書き込み (2006-04-03 15:33) より:
田中さんって VB 使いじゃなかったでしたっけ?

間違えてわざわざ苦手な VB で書いちゃいましたよ... orz



ひっ、ひどいです。
CShaper になる一番のきっかけを作った人だったのに。(以下、参照)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=28458&forum=7&start=11

ということで確認のために C# にしてみました。
とても便利なので CShaper な皆さんも使いましょう。

コード:
public class BaseFieldEnum {
    public BaseFieldEnum() {
        Type hType = this.GetType();
        System.Reflection.FieldInfo[] hFieldInfos = hType.GetFields(
            System.Reflection.BindingFlags.GetField | 
            System.Reflection.BindingFlags.Public | 
            System.Reflection.BindingFlags.Instance |
            System.Reflection.BindingFlags.DeclaredOnly
        );
        foreach (System.Reflection.FieldInfo one in hFieldInfos) {
            one.SetValue(this, one.Name);
        }
    }
}
sealed public class ShohinMaster : BaseFieldEnum {
    public readonly string 商品コード, 商品名, 単価, バラ単位;
}

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-03 16:44
引用:

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

#ToString() って、よく () を忘れませんか?


それは VB のやりすぎだと思います。(多分、多分ね)

ところで、ここまで頑張ったんですが...
.NET では、ネストされたクラスは、デフォルトで静的メンバになるんでしたね。
イニシャライザ (静的コンストラクタ) で、どっかーんで行こうと思ったのに... orz

コード:

    Option Strict On

    ' イラネ : <Microsoft.VisualBasic.CompilerServices.StandardModule()> _
    Public Class Fields

      #Region " イニシャライザ "

        Shared Sub New()
            Dim hMyClassType As System.Type = GetType(Fields)
            Dim hNastedTypes As System.Type() = hMyClassType.GetNestedTypes( _
                System.Reflection.BindingFlags.Public       Or _
                System.Reflection.BindingFlags.Instance     Or _
                System.Reflection.BindingFlags.DeclaredOnly    _
            )

            For Each hType As System.Type In hNastedTypes
                Dim hFieldInfos As System.Reflection.FieldInfo() = hType.GetFields ( _
                    Reflection.BindingFlags.GetField     Or _
                    Reflection.BindingFlags.Public       Or _
                    Reflection.BindingFlags.Static       Or _
                    Reflection.bindingflags.DeclaredOnly    _            
                )

                For Each hFieldInfo As System.Reflection.FieldInfo In hFieldInfos
                    hFieldInfo.SetValue(hType, hFieldInfo.Name)
                Next
            Next
        End Sub

      #End Region

      #Region " 商品マスタ "

        Public MustInherit Class 商品マスタ
            Public Shared ReadOnly _
                商品コード, _
                商品名,     _
                単価,       _
                バラ単位    _
            As String
        End Class

      #End Region

      #Region " 得意先マスタ "

        Public MustInherit Class 得意先マスタ
            Public Shared ReadOnly _
                得意先コード, _
                得意先名,     _
                得意先略名,   _
                田中はんはメシの食いすぎでー腹を壊してポスピタルー _
            As String
        End Class

      #End Region

    End Class


とりあえず、Fields クラスに "何か" すれば後は勝手に入れたいものが入ります。
普通のコンストラクタにして、インスタンス化して使用した方が良いですね。
それにしても、インスタンス化を強制できないのが痛い...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-03 16:55
引用:

R・田中一郎さんの書き込み (2006-04-03 16:17) より:

ということで確認のために C# にしてみました。
とても便利なので CShaper な皆さんも使いましょう。


作った本人が言うのもなんですが、あんまり使いたくないんです。
まず、数が多くなってくると、ちょっと負荷が気になってきます。

それと、用途は定数なので、いちいちインスタンス化したくないものです。
できれば、静的メンバでやってしまいたいと思って作ったのが、
明示的に何かしないと動かないというマヌケなイニシャライザ... orz

あの後、J# でネストされたクラスをインスタンス メンバとして扱おうと頑張ったのですが、
今度は、そのクラス内で静的メンバが認められず断念。
               (↑そりゃ、そうだろw)

できれば、フィールドに関しては静的メンバにしたかったのに残念です。(;_ _)

最初にインスタンス化するというお約束ができるのであれば、
先の 2 番目の案「Shared Sub New」を、通常のコンストラクタ「Public Sub New」に変えてあげれば...

_________________
×じゃんぬ @ わんくま同盟 - Microsoft MVP for Visual Developer J#
       ↓ ↓ ↓
_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-03 17:18
先ほどリフレクションの意味と、中の動きを F11 で確認しました。
なるほどー。こういうことだったんですね(一人で納得)

引用:

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

ところで、ここまで頑張ったんですが...
.NET では、ネストされたクラスは、デフォルトで静的メンバになるんでしたね。
イニシャライザ (静的コンストラクタ) で、どっかーんで行こうと思ったのに... orz



確かに、イニシャライザでどかんとできるのが理想なんでしょうけど、これでも十分
に便利です。
ありがとうございました。

引用:

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

コード:
            Public Shared ReadOnly _
                得意先コード, _
                得意先名,     _
                得意先略名,   _
                田中はんはメシの食いすぎでー腹を壊してポスピタルー _
            As String





これはラップ調に読めば良いのですか?

#じゃんぬねっとさんがラッパーだったとは。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-03 19:27
引用:

R・田中一郎さんの書き込み (2006-04-03 17:18) より:

確かに、イニシャライザでどかんとできるのが理想なんでしょうけど、
これでも十分に便利です。


もうちょっと考えてみます。

といっても、プロパティなどの機構がない以上、どこに処理を挟めば良いのやら...
読み取り専用の静的フィールドにしなきゃ利便性が悪いですし... (;_ _)

最初のリフレクション案の方が、使用前に保証されるので良いかもしれません。

コード:

    '/** ここでインスタンス化しておく */
    <Microsoft.VisualBasic.CompilerServices.StandardModule()> _
    Public NotInheritable Class F
        Public Shared ReadOnly 商品マスタ   As New ShohinMaster()
        Public Shared ReadOnly 得意先マスタ As New TokuisakiMaster()
    End Class

    '/** BaseFields クラス */
    Public MustInherit Class BaseFields
        Public Sub New()
            Dim hType As Type = Me.GetType()
            Dim hFieldInfos As System.Reflection.FieldInfo() = hType.GetFields ( _
                System.Reflection.BindingFlags.GetField     Or _
                System.Reflection.BindingFlags.Public       Or _
                System.Reflection.BindingFlags.Instance     Or _
                System.Reflection.bindingflags.DeclaredOnly    _
            )

            For Each one As System.Reflection.FieldInfo In hFieldInfos
                one.SetValue(Me, one.Name)
            Next
        End Sub
    End Class

    '/** 商品マスタ */
    Public NotInheritable Class ShohinMaster : Inherits BaseFields
        Public ReadOnly     _
            商品コード,     _
            商品名,         _
            単価,           _
            バラ単位,       _
            もうかりまっか, _
            ぼちぼちでんな  _
        As String
    End Class

    '/** 得意先マスタ */
    Public NotInheritable Class TokuisakiMaster : Inherits BaseFields
        Public ReadOnly   _
            得意先コード, _
            得意先名,     _
            得意先略名    _  
        As String
    End Class


私の頭では、もう思いつきません。

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

アイティメディアの提供サービス

ホワイトペーパー(TechTargetジャパン/閲覧には会員登録が必要です)

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