すべてのメンバを取得するにはTypeクラスの GetMembersメソッドを使用します。
ここでの「すべてのメンバ」とは、メソッド、プロパティ、フィールドなどを指します。
例えば、以下のようなTestClassというクラスがあるとします。
VBの例
Public Class TestClass ' フィールド Private _testProperty As String ''' <summary> ''' コンストラクタ ''' </summary> ''' <remarks></remarks> Public Sub New() End Sub ''' <summary> ''' プロパティ ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property TestProperty() As String Get Return _testProperty End Get Set(ByVal value As String) _testProperty = value End Set End Property ''' <summary> ''' メソッド ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Public Function TestMethod() As Boolean Return True End Function End Class
C#の例
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionCS { class TestClass { // フィールド private string _testField = string.Empty; /// <summary> /// コンストラクタ /// </summary> public TestClass() { } /// <summary> /// プロパティ /// </summary> public string TestProperty { get { return _testField; } set { _testField = value; } } /// <summary> /// メソッド /// </summary> /// <returns></returns> public bool TestMethod() { return true; } } }
上記クラスのメンバ情報を取得するには、以下のようなコードを書きます。
VBの例
Sub Main() Dim t As Type = GetType(ReflectionVB.TestClass) 'メンバを取得する Dim members As MemberInfo() = t.GetMembers( _ BindingFlags.Public Or BindingFlags.NonPublic Or _ BindingFlags.Instance Or BindingFlags.Static Or _ BindingFlags.DeclaredOnly) For Each m As MemberInfo In members Console.WriteLine("{0}", m.Name) Next Console.ReadLine() End Sub
C#の例
static void Main(string[] args) { ////TestClass tc = new TestClass(); ////tc.DispInfo(); //var asm = Assembly.GetExecutingAssembly(); //// アセンブリのバージョンを取得 //var version = asm.GetName().Version; //Console.WriteLine(version); Type type = typeof(ReflectionCS.TestClass); //メンバを取得する MemberInfo[] members = type.GetMembers( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly); foreach (MemberInfo mb in members) { Console.WriteLine("{0}", mb.Name); } Console.ReadLine(); }
GetMembersのメソッドに指定可能な BindingFlagsは以下の通りです。
この BindingFlagsにより、取得したいメンバを決定することができます。
メンバ | 説明 |
Public | パブリックメンバ |
NonPublic | 非パブリックメンバ |
Instance | インスタンスメンバ |
Static | 静的メンバ |
DeclaredOnly | 継承メンバーを除外 |
実行例は以下の通りです。
実行例の
get_TestProperty、set_TestPropertyはプロパティ内にあるゲッターとセッターを表しています。
TestMethodは、クラス内にあるメソッド名です。
.ctorというのは、コンストラクタです。
TestPropertyは、クラス内にあるプロパティ名です。
_testPropertyは、クラス内にあるフィールドです。
このように、GetMembersメソッドを使用することで、すべてのメンバーを取得することができます。
最後に、メンバーのタイプも表示するようにコードを修正してみましょう。
For Each(C#はforeach)を以下のように書き換えてください。
m.MemberTypeがメンバーのタイプを表します。
VBの例
For Each m As MemberInfo In members Console.WriteLine("{0}:{1}", m.MemberType, m.Name) Next
C#の例
foreach (MemberInfo mb in members) { Console.WriteLine("{0}:{1}", mb.MemberType, mb.Name); }
実行例は以下の通りです。
Please follow and like us:
コメント