電子書籍の厳選無料作品が豊富!

こんにちは、お世話になっています。
日曜プログラムな感じなんですが、自学習でクラス作成しております。作成にあたって、逐次テストプログラムも同時につくっています。そこで、プロパティーの属性についての質問です。コードで任意のプロパティーの属性を取得したり、判定したりすることができるのかどうか・・・です。

たとえば、あるクラス"Boo"のプロパティ"Foo"があったとして、設計意図上【"Foo"はReadOnly修飾子が与えられていなえればならない】としています。このとき、うっかりしたり他者がからんだりで、FooのReadOnly修飾子をはずして、Setブロックを追加してしまった・・・なんて事が起きたとき、発見したいと考えています。蛇足ですが、メンバのプライベートをパブリックにしちゃったとか、勝手に新しいメンバを追加しちゃったとかも・・・

環境は、VB2010Express、.NET2.0、コンソールアプリケーションです。プロジェクト上に テストプログラム兼スタートアップMain()を含むファイルModule1.vbとテスト対象Boo.Fooを含むBoo.vbで構成されたプロジェクトです。希望的には、テストプログラムのランタイム時の検出がうれしいのですが、コンパイル時にエラーを出す等のプリプロセスでもかまいません。

言葉による説明で申し訳ないですが、ご存知の方、レス頂けるとうれしいです。よろしくお願いいたします。

----- Magna

A 回答 (2件)

こういう話?


#サイトの都合上色分けおかしいけど気にするな

http://ideone.com/clone/q4Ndx
「プロパティーの属性取得」の回答画像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

補足日時:2011/02/19 01:19
    • good
    • 0
この回答へのお礼

回答ありがとうございました!
私のつたない文章から意図を読み取っていただき、サンプルコードまで書いていただいて、大変感謝しております。これからも、頑張ってください(迷える質問への回答を~)。

----- Magna

お礼日時:2011/02/19 01:56

typeof(Boo).GetMember("Foo").IsReadOnly

    • good
    • 0
この回答へのお礼

回答ありがとうございます。参考になりました。

がんばってみたのですが、VBやらドットNETやらに不勉強でなかなか意図したとおりにはならなかったですが、GetMemberやMemberInfoなるモノの存在をしりました。GetMembersしてみると、プロパティが、get_Fooになって見えたりとか、おもしろかったです。

お礼日時:2011/02/19 01:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!