Visual Basic サンプル集 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 >
クラスのメンバー一覧を取得する
2020/10/25
目次
メソッドの名前の一覧を取得
次の例は String クラスの Public なメソッドの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に Imports System.Reflection が記述されていることが前提です。
Dim flag
As
BindingFlags =
BindingFlags.Public
Or
BindingFlags.Instance
Or
BindingFlags.Static
Or
BindingFlags.FlattenHierarchy 'flag = flag Or BindingFlags.NonPublic '←この行を有効にすると、非Public(Private, Protectedなど)のメソッドも取得できます。 Dim methods As MethodInfo() = GetType(String).GetMethods(flag) '←ここで対象を String と指定 'Dim methods As MethodInfo() = 変数.GetType.GetMethods(flag) '←このようにすると、変数から呼び出せるメソッドの一覧を取得できます。 For Each method As MethodInfo In methods If method.IsSpecialName Then 'プロパティ・イベント・演算子のために自動生成されたメソッドは対象外にします。 Continue For End If Debug.WriteLine(method.Name) Next |
- コメントの行を有効にするとPrivate, Protectedなど非Publicなメソッドも取得できます。ただし、基底クラスのPrivateなメソッドは取得できません。
- オーバーロードされて同じ名前のメソッドが複数存在する場合、複数出力されます。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
メソッドの名前と引数と戻り値の一覧を取得
次の例は Integer (Int32構造体)の Public なメソッドの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に Imports System.Reflection が記述されていることが前提です。
Dim flag
As
BindingFlags =
BindingFlags.Public
Or
BindingFlags.Instance
Or
BindingFlags.Static
Or
BindingFlags.FlattenHierarchy 'flag = flag Or BindingFlags.NonPublic '←この行を有効にすると、非Public(Private, Protectedなど)のメソッドも取得できます。 Dim methods As MethodInfo() = GetType(Integer).GetMethods(flag) '←ここで対象を Integer と指定 'Dim methods As MethodInfo() = 変数.GetType.GetMethods(flag) '←このようにすると、変数から呼び出せるメソッドの一覧を取得できます。 For Each method As MethodInfo In methods If method.IsSpecialName Then 'プロパティ・イベント・演算子のために自動生成されたメソッドは対象外にします。 Continue For End If '▼メソッド名を出力 Debug.Write(method.Name) '▼パラメーターリストを出力 Dim paramDescriptions As New List(Of String) For Each param As ParameterInfo In method.GetParameters paramDescriptions.Add(param.Name & " As " & param.ParameterType.Name) Next Debug.Write("(") Debug.Write(String.Join(", ", paramDescriptions.ToArray)) Debug.Write(")") '▼戻り値を出力 Dim returnTypeName As String = method.ReturnType.Name If returnTypeName <> GetType(System.Void).Name Then Debug.Write(" As ") Debug.Write(returnTypeName) End If Debug.WriteLine("") Next |
実行すると次のように出力されます。型の表現は フレームワークの表現になるため、たとえば、IntegerはInt32となり、配列は [] で表されるなどVBの表現とは異なります。
CompareTo(value As Object) As Int32
CompareTo(value As
Int32) As Int32
Equals(obj As Object) As Boolean
Equals(obj As Int32) As Boolean
GetHashCode() As Int32
ToString() As String
以下略
- コメントの行を有効にするとPrivate, Protectedなど非Publicなメソッドも取得できます。ただし、基底クラスのPrivateなメソッドは取得できません。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
プロパティの名前の一覧を取得
次の例は Date 構造体の Public なプロパティの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に Imports System.Reflection が記述されていることが前提です。
Dim flag
As
BindingFlags =
BindingFlags.Public
Or
BindingFlags.Instance
Or
BindingFlags.Static
Or
BindingFlags.FlattenHierarchy 'flag = flag Or BindingFlags.NonPublic '←この行を有効にすると、非Public(Private, Protectedなど)のメソッドも取得できます。 Dim props As PropertyInfo() = GetType(Date).GetProperties(flag) '←ここで対象を Date と指定 'Dim props As PropertyInfo() = 変数.GetType.GetProperties(flag) '←このようにすると、変数から呼び出せるプロパティの一覧を取得できます。 For Each prop As PropertyInfo In props Debug.WriteLine(prop.Name) Next |
- コメントの行を有効にするとPrivate, Protectedなど非Publicなメソッドも取得できます。ただし、基底クラスのPrivateなメソッドは取得できません。
- オーバーロードされて同じ名前のプロパティが複数存在する場合、複数出力されます。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
プロパティの名前と型の一覧を取得
次の例は Date 構造体の Public なプロパティの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に Imports System.Reflection が記述されていることが前提です。
Dim flag
As
BindingFlags =
BindingFlags.Public
Or
BindingFlags.Instance
Or
BindingFlags.Static
Or
BindingFlags.FlattenHierarchy 'flag = flag Or BindingFlags.NonPublic '←この行を有効にすると、非Public(Private, Protectedなど)のプロパティも取得できます。 Dim props As PropertyInfo() = GetType(Date).GetProperties(flag) '←ここで対象を Date と指定 'Dim props As PropertyInfo() = 変数.GetType.GetProperties(flag) '←このようにすると、変数から呼び出せるプロパティの一覧を取得できます。 For Each prop As PropertyInfo In props '▼プロパティ名を出力 Debug.Write(prop.Name) '▼型を出力 Debug.Write(" As ") Debug.Write(prop.PropertyType.Name) Debug.WriteLine("") Next |
- コメントの行を有効にするとPrivate, Protectedなど非Publicなプロパティも取得できます。ただし、基底クラスのPrivateなプロパティは取得できません。
- 型の表現は フレームワークの表現になるため、たとえば、IntegerはInt32となり、配列は [] で表されるなどVBの表現とは異なります。
- オーバーロードされて同じ名前のプロパティが複数存在する場合、複数出力されます。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
フィールドの一覧を取得
次の例は Math クラスの Public なフィールドの一覧を表示します。フィールドとはクラスレベルの変数と定数のことです。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に Imports System.Reflection が記述されていることが前提です。
Dim flag
As
BindingFlags =
BindingFlags.Public
Or
BindingFlags.Instance
Or
BindingFlags.Static
Or
BindingFlags.FlattenHierarchy 'flag = flag Or BindingFlags.NonPublic '←この行を有効にすると、非Public(Private, Protectedなど)のフィールドも取得できます。 Dim fields As FieldInfo() = GetType(Math).GetFields(flag) '←ここで対象を Math と指定 'Dim fields As FieldInfo() = 変数.GetType.GetFields(flag) '←このようにすると、変数から呼び出せるフィールドの一覧を取得できます。 For Each field As FieldInfo In fields '▼フィールド名を出力 Debug.Write(field.Name) '▼型を出力 Debug.Write(" As ") Debug.Write(field.FieldType.Name) Debug.WriteLine("") Next |
- コメントの行を有効にするとPrivate, Protectedなど非Publicなフィールドも取得できます。ただし、基底クラスのPrivateなフィールドは取得できません。
- 型の表現は フレームワークの表現になるため、たとえば、IntegerはInt32となり、配列は [] で表されるなどVBの表現とは異なります。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
イベントの一覧を取得
次の例は Form クラス(System.Windows.Forms.Form)の Public なイベントの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に Imports System.Reflection が記述されていることが前提です。
Dim flag
As
BindingFlags =
BindingFlags.Public
Or
BindingFlags.Instance
Or
BindingFlags.Static
Or
BindingFlags.FlattenHierarchy 'flag = flag Or BindingFlags.NonPublic '←この行を有効にすると、非Public(Private, Protectedなど)のイベントも取得できます。 Dim events As EventInfo() = GetType(System.Windows.Forms.Form).GetEvents(flag) '←ここで対象を Form と指定 'Dim events As EventInfo() = 変数.GetType.GetEvents(flag) '←このようにすると、変数から呼び出せるイベントの一覧を取得できます。 For Each ev As EventInfo In events '▼イベント名を出力 Debug.Write(ev.Name) '▼パラメーターリストを出力 Dim paramDescriptions As New List(Of String) For Each param In ev.EventHandlerType.GetMethod("Invoke").GetParameters paramDescriptions.Add(param.Name & " As " & param.ParameterType.Name) Next Debug.Write("(") Debug.Write(String.Join(", ", paramDescriptions.ToArray)) Debug.Write(")") Debug.WriteLine("") Next |
実行すると次のように出力されます。型の表現は フレームワークの表現になるため、たとえば、IntegerはInt32となり、配列は [] で表されるなどVBの表現とは異なります。
AutoSizeChanged(sender As Object, e As EventArgs)
AutoValidateChanged(sender As Object, e As EventArgs)
HelpButtonClicked(sender As Object, e As CancelEventArgs)
MaximizedBoundsChanged(sender As Object, e As EventArgs)
MaximumSizeChanged(sender As Object, e As EventArgs)
MarginChanged(sender As Object, e As EventArgs)
- コメントの行を有効にするとPrivate, Protectedなど非Publicなイベントも取得できます。ただし、基底クラスのPrivateなイベントは取得できません。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
コンストラクターの一覧を取得
次の例は FileInfo クラスの Public なコンストラクターの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に Imports System.Reflection が記述されていることが前提です。
Dim flag
As
BindingFlags =
BindingFlags.Public
Or
BindingFlags.Instance
Or
BindingFlags.Static
Or
BindingFlags.FlattenHierarchy 'flag = flag Or BindingFlags.NonPublic '←この行を有効にすると、非Public(Private, Protectedなど)のコンストラクターも取得できます。 Dim ctors As ConstructorInfo() = GetType(System.IO.FileInfo).GetConstructors(flag) '←ここで対象を FileInfo と指定 'Dim ctors As ConstructorInfo() = 変数.GetType.GetConstructors(flag) '←このようにすると、変数のクラス・構造体の持つコンストラクター一覧を取得できます。 For Each ctor As ConstructorInfo In ctors '▼固定で Sub New 出力(VBではコンストラクターの宣言は必ず Sub New であるため模倣します) Debug.Write("Sub New") '▼パラメーターリストを出力 Dim paramDescriptions As New List(Of String) For Each param As ParameterInfo In ctor.GetParameters paramDescriptions.Add(param.Name & " As " & param.ParameterType.Name) Next Debug.Write("(") Debug.Write(String.Join(", ", paramDescriptions.ToArray)) Debug.Write(")") Debug.WriteLine("") Next |
- コメントの行を有効にするとPrivate, Protectedなど非Publicなコンストラクターも取得できます。ただし、基底クラスのPrivateなコンストラクターは取得できません。
- 型の表現は フレームワークの表現になるため、たとえば、IntegerはInt32となり、配列は [] で表されるなどVBの表現とは異なります。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
メンバーの一覧を取得
次の例で示す GetClassMembersメソッドを使用するとクラス・構造体のメンバーの一覧をVisual Basicのプログラムに似た形式で出力できます。使用例は下にあります。
ファイルの上の方に Imports System.Reflection が記述されていることが前提です。
Public Function
GetClassMembers(Of
T)(o
As
T)
As String Return GetClassMembers(Of T)() End Function Public Function GetClassMembers(Of T)() As String Dim flag As BindingFlags = BindingFlags .Public Or BindingFlags .Instance Or BindingFlags .Static Or BindingFlags .FlattenHierarchy 'flag = flag Or BindingFlags.NonPublic '←この行を有効にすると、非Public(Private, Protectedなど)のメンバーも取得できます。 Dim members As MemberInfo() = GetType(T).GetMembers(flag) Dim sb As New StringBuilder For Each member As MemberInfo In members If member.MemberType = MemberTypes.Constructor Then 'コンストラクターの場合 Dim ctor As ConstructorInfo = DirectCast(member, ConstructorInfo ) '▼アクセススコープ(Public, Private等) sb.Append(GetAccessScope(ctor)) '▼Shared If ctor.IsStatic Then sb.Append("Shared ") End If '▼宣言 sb.Append("Sub New") '▼パラメーターリスト Dim paramDescriptions As New List(Of String) For Each param As ParameterInfo In ctor.GetParameters paramDescriptions.Add(param.Name & " As " & param.ParameterType.Name) Next sb.Append("(" & String.Join(", ", paramDescriptions.ToArray) & ")") ElseIf member.MemberType = MemberTypes.Event Then 'イベントの場合 Dim ev As EventInfo = DirectCast(member, EventInfo ) '▼アクセススコープ(Public, Private等) Dim method As MethodInfo = ev.AddMethod sb.Append(GetAccessScope(method)) '▼Shared If method.IsStatic Then sb.Append("Shared ") End If '▼宣言 sb.Append("Event ") '▼イベント名を出力 sb.Append(ev.Name) '▼パラメーターリスト Dim paramDescriptions As New List(Of String) For Each param In ev.EventHandlerType.GetMethod("Invoke").GetParameters paramDescriptions.Add(param.Name & " As " & param.ParameterType.Name) Next sb.Append("(" & String.Join(", ", paramDescriptions.ToArray) & ")") ElseIf member.MemberType = MemberTypes.Field Then 'フィールドの場合 Dim field As FieldInfo = DirectCast(member, FieldInfo ) '▼アクセススコープ(Public, Private等) sb.Append(GetAccessScope(field)) '▼Shared と Const If field.IsStatic Then If field.IsLiteral Then sb.Append("Const ") Else sb.Append("Shared ") End If End If '▼フィールド名を出力 sb.Append(field.Name) '▼型 sb.Append(" As " & field.FieldType.Name) '▼定数の場合、その値 If field.IsLiteral Then sb.Append(" = " & field.GetRawConstantValue.ToString) End If ElseIf member.MemberType = MemberTypes.Method Then 'メソッドの場合 Dim method As MethodInfo = DirectCast(member, MethodInfo ) If method.IsSpecialName Then Continue For End If '▼アクセススコープ(Public, Private等) sb.Append(GetAccessScope(method)) '▼Shared If method.IsStatic Then sb.Append("Shared ") End If '▼宣言 '戻り値の型を確認。(Voidの場合Sub、それ以外の場合Function) Dim returnTypeName As String= method.ReturnType.Name If returnTypeName <> GetType(System.Void).Name Then sb.Append("Function ") Else sb.Append("Sub ") End If '▼メソッド名を出力 sb.Append(method.Name) '▼パラメーターリスト Dim paramDescriptions As New List(Of String) For Each param As ParameterInfo In method.GetParameters paramDescriptions.Add(param.Name & " As " & param.ParameterType.Name) Next sb.Append("(" & String.Join(", ", paramDescriptions.ToArray) & ")") '▼戻り値を出力 If returnTypeName <> GetType(System.Void).Name Then sb.Append(" As " & returnTypeName) End If ElseIf member.MemberType = MemberTypes.Property Then 'プロパティの場合 Dim prop As PropertyInfo = DirectCast(member, PropertyInfo ) '▼アクセススコープ(Public, Private等) 'この例ではGetでスコープを判断します。Getが存在しない場合やGetとSetとアクセススコープが違う場合がありえますが、このサンプルでは想定しません。 Dim method As MethodInfo = prop.GetMethod sb.Append(GetAccessScope(method)) '▼Shared If method.IsStatic Then sb.Append("Shared ") End If '▼宣言 sb.Append("Property ") '▼プロパティ名を出力 sb.Append(prop.Name) '▼型 sb.Append(" As " & prop.PropertyType.Name) End If sb.AppendLine() Next Return sb.ToString End Function Public Function GetAccessScope(member As MemberInfo) As String If CBool(member.GetType.GetProperty("IsPublic").GetValue(member)) Then Return "Public " End If If CBool(member.GetType.GetProperty("IsAssembly").GetValue(member)) Then Return "Friend " End If If CBool(member.GetType.GetProperty("IsFamily").GetValue(member)) Then Return "Protected " End If If CBool(member.GetType.GetProperty("IsFamilyOrAssembly").GetValue(member)) Then Return "Protecte Friend " End If If CBool(member.GetType.GetProperty("IsFamilyAndAssembly").GetValue(member)) Then Return "Private Protected " End If If CBool(member.GetType.GetProperty("IsPrivate").GetValue(member)) Then Return "Private " End If Throw New ArgumentException() End Function |
- コメントの行を有効にするとPrivate, Protectedなど非Publicなコンストラクターも取得できます。ただし、基底クラスのPrivateなコンストラクターは取得できません。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
- この例はVBのプログラムになぞらえて出力していますが、ByVal/ByRef, ReadOnly/WriteOnly など対応していないキーワード・構文も多々あります。プログラム内のコメントを参照してください。
出力例(抜粋)
Public Sub ResetText()
Public Function
GetNextControl(ctl As Control, forward As Boolean) As
Control
Public Sub New()
Public Property BackColor As
Color
Public Shared Property MousePosition As Point
Public Event Click(sender As Object, e As EventArgs)
Public Event MouseWheel(sender As Object, e As
MouseEventArgs)
使用例1:Buttonクラスのメンバー一覧を出力
Dim definition
As String =
GetClassMembers(Of
Button)() Debug.WriteLine(definition) |
使用例2:Date構造体のメンバー一覧を出力
Dim definition
As String =
GetClassMembers(Of Date)() Debug.WriteLine(definition) |
使用例3:Date型の変数からそのメンバー一覧を出力
Dim d
As Date =
New Date(2024, 6,
27) Dim definition As String = GetClassMembers(d) Debug.WriteLine(definition) |