こんにちは、お世話になっています。
日曜プログラムな感じなんですが、自学習でクラス作成しております。作成にあたって、逐次テストプログラムも同時につくっています。そこで、プロパティーの属性についての質問です。コードで任意のプロパティーの属性を取得したり、判定したりすることができるのかどうか・・・です。
たとえば、あるクラス"Boo"のプロパティ"Foo"があったとして、設計意図上【"Foo"はReadOnly修飾子が与えられていなえればならない】としています。このとき、うっかりしたり他者がからんだりで、FooのReadOnly修飾子をはずして、Setブロックを追加してしまった・・・なんて事が起きたとき、発見したいと考えています。蛇足ですが、メンバのプライベートをパブリックにしちゃったとか、勝手に新しいメンバを追加しちゃったとかも・・・
環境は、VB2010Express、.NET2.0、コンソールアプリケーションです。プロジェクト上に テストプログラム兼スタートアップMain()を含むファイルModule1.vbとテスト対象Boo.Fooを含むBoo.vbで構成されたプロジェクトです。希望的には、テストプログラムのランタイム時の検出がうれしいのですが、コンパイル時にエラーを出す等のプリプロセスでもかまいません。
言葉による説明で申し訳ないですが、ご存知の方、レス頂けるとうれしいです。よろしくお願いいたします。
----- Magna
No.1ベストアンサー
- 回答日時:
この回答への補足
はい、まさしくそのとおりです。
サンプルコードまでいただいて、大変ありがたかったです。実は実行時に例外が発行されて、MSDNとにらめっこしていました。Type.GetType(typeName As String [,…])を使うとき、typeNameに"Boo"を渡すとTypeLoadExceptionが発行されました。僕の環境では、名前空間を含むフルネームで与えないといけないようです。プロジェクト名が"Woo"として、typeNameは、"Woo.Boo"とあたえる事で、所望の結果を得ることができました。下記にいただいたサンプルコードを再掲載します。23行目、29行目が僕の変更点です。
01:Imports System
02:
03:Class Boo
04: Private x As Integer
05: Public ReadOnly Property Foo1() As Integer
06: Get
07: Return x
08: End Get
09: End Property
10: Public Property Foo2() As Integer
11: Get
12: Return x
13: End Get
14: Set(ByVal Value As Integer)
15: x = Value
16: End Set
17: End Property
18:End Class
19:
20:Class HOGE
21: Public Shared Sub Main()
22: Dim p1 As System.Reflection.PropertyInfo _
23: = Type.GetType("Woo.Boo",true).GetProperty("Foo1")
24: 'p1がNothingであるかどうかのチェックは面倒なので省略
25: System.Console.WriteLine(p1.CanRead)
26: System.Console.WriteLine(Not(p1.CanWrite))
27:
28: Dim p2 As System.Reflection.PropertyInfo _
29: = Type.GetType("Woo.Boo",true).GetProperty("Foo2")
30: 'p1がNothingであるかどうかのチェックは面倒なので省略
31: System.Console.WriteLine(p2.CanRead)
32: System.Console.WriteLine(Not(p2.CanWrite))
33:
34: End Sub
35:End Class
ついでではありますが、Class Typeを調べているうちに、GetType演算子を見つけました。こっちを使うと、汎用性は損なわれそうな感じですが、同一プロジェクト内での使用は、比較的簡単みたいに思います。下記のような感じで、クラスBooのPublic修飾の有無やプロパティFoo1のRead/Write属性が取得できました。
01: GetType(Boo).IsPublic
02: GetType(Boo).IsNotPublic
03: GetType(Boo).GetProperty("Foo1").CanRead
04: GetType(Boo).GetProperty("Foo1").CanWrite
----- Magna
回答ありがとうございました!
私のつたない文章から意図を読み取っていただき、サンプルコードまで書いていただいて、大変感謝しております。これからも、頑張ってください(迷える質問への回答を~)。
----- Magna
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
九九の答えの計算
-
RS-232C接続のための VS 2008 C...
-
MSCommによるCOMポートの制御
-
IPアドレスの競合について
-
VBでUSB制御プログラム作成する...
-
Designer.vbは直接コードをいじ...
-
VBSから別のVBS起動するとき変...
-
Visual Studio 「AnyCpu」について
-
ManagementClassが見つからない。
-
アウトルックが起動しているか...
-
印刷ダイアログを表示させない方法
-
vba 時間の引き算 例えば 15:00...
-
意味不明の実行時エラーで困っ...
-
「読み込み違反」が起きたとき...
-
VBでExcel印刷する時のプリンタ...
-
VB6(SP5)+OO4OでCreateObjectが...
-
印刷要求順番と印刷出力順番が...
-
C++初心者です。 debug asserti...
-
VB.NETでSPREADの設定方法
-
excel vbaから実行するexe実行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
RS-232C接続のための VS 2008 C...
-
VBでUSB制御プログラム作成する...
-
VBSでサウンドデバイスの変更方...
-
九九の答えの計算
-
Visual Basicでの平方関数について
-
外部装置を扱うプログラムについて
-
美しいソースコード
-
VB.NETの白黒判別プログラム教...
-
シリアル通信の通信・検証方法...
-
COMポート通信で断線
-
MSCommによるCOMポートの制御
-
ミキサーの情報の取得方法を教えて
-
シリアル(rs232c)でのパソコ...
-
Lotus Notesのカレンダーに外部...
-
拡張子に関連ついているプログ...
-
Office VBAについて
-
派遣社員ですビジュアルベーシ...
-
PIC18F2520を用いたLCD制御につ...
-
Android Studio で実行 できま...
-
vba 時間の引き算 例えば 15:00...
おすすめ情報