ヘッダー
Visual Basic サンプル集
VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

クラスのメンバー一覧を取得する

2020/10/25

→ C# のサンプルに切り替える

 

 

メソッドの名前の一覧を取得

次の例は String クラスの Public なメソッドの一覧を表示します。

共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。

ファイルの上の方に Imports System.Reflection が記述されていることが前提です。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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

Debug.WriteLineが表示される場所

  • コメントの行を有効にするとPrivate, Protectedなど非Publicなメソッドも取得できます。ただし、基底クラスのPrivateなメソッドは取得できません。
  • オーバーロードされて同じ名前のメソッドが複数存在する場合、複数出力されます。
  • flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果

 

 

メソッドの名前と引数と戻り値の一覧を取得

次の例は Integer (Int32構造体)の Public なメソッドの一覧を表示します。

共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。

ファイルの上の方に Imports System.Reflection が記述されていることが前提です。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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

Debug.WriteLineが表示される場所

実行すると次のように出力されます。型の表現は フレームワークの表現になるため、たとえば、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 が記述されていることが前提です。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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

Debug.WriteLineが表示される場所

  • コメントの行を有効にするとPrivate, Protectedなど非Publicなメソッドも取得できます。ただし、基底クラスのPrivateなメソッドは取得できません。
  • オーバーロードされて同じ名前のプロパティが複数存在する場合、複数出力されます。
  • flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果

 

 

プロパティの名前と型の一覧を取得

次の例は Date 構造体の Public なプロパティの一覧を表示します。

共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。

ファイルの上の方に Imports System.Reflection が記述されていることが前提です。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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

Debug.WriteLineが表示される場所

  • コメントの行を有効にするとPrivate, Protectedなど非Publicなプロパティも取得できます。ただし、基底クラスのPrivateなプロパティは取得できません。
  • 型の表現は フレームワークの表現になるため、たとえば、IntegerはInt32となり、配列は [] で表されるなどVBの表現とは異なります。
  • オーバーロードされて同じ名前のプロパティが複数存在する場合、複数出力されます。
  • flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果

 

 

フィールドの一覧を取得

次の例は Math クラスの Public なフィールドの一覧を表示します。フィールドとはクラスレベルの変数と定数のことです。

共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。

ファイルの上の方に Imports System.Reflection が記述されていることが前提です。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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

Debug.WriteLineが表示される場所

  • コメントの行を有効にするとPrivate, Protectedなど非Publicなフィールドも取得できます。ただし、基底クラスのPrivateなフィールドは取得できません。
  • 型の表現は フレームワークの表現になるため、たとえば、IntegerはInt32となり、配列は [] で表されるなどVBの表現とは異なります。
  • flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果

 

 

イベントの一覧を取得

次の例は Form クラス(System.Windows.Forms.Form)の Public なイベントの一覧を表示します。

共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。

ファイルの上の方に Imports System.Reflection が記述されていることが前提です。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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

Debug.WriteLineが表示される場所

実行すると次のように出力されます。型の表現は フレームワークの表現になるため、たとえば、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 が記述されていることが前提です。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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

Debug.WriteLineが表示される場所

  • コメントの行を有効にするとPrivate, Protectedなど非Publicなコンストラクターも取得できます。ただし、基底クラスのPrivateなコンストラクターは取得できません。
  • 型の表現は フレームワークの表現になるため、たとえば、IntegerはInt32となり、配列は [] で表されるなどVBの表現とは異なります。
  • flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果

 

 

メンバーの一覧を取得

次の例で示す GetClassMembersメソッドを使用するとクラス・構造体のメンバーの一覧をVisual Basicのプログラムに似た形式で出力できます。使用例は下にあります。

ファイルの上の方に Imports System.Reflection が記述されていることが前提です。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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クラスのメンバー一覧を出力

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim definition As String = GetClassMembers(Of Button)()
Debug.WriteLine(definition)

Debug.WriteLineが表示される場所

使用例2:Date構造体のメンバー一覧を出力

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim definition As String = GetClassMembers(Of Date)()
Debug.WriteLine(definition)

Debug.WriteLineが表示される場所

使用例3:Date型の変数からそのメンバー一覧を出力

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim d As Date = New Date(2024, 6, 27)
Dim definition As String = GetClassMembers(d)
Debug.WriteLine(definition)

Debug.WriteLineが表示される場所

 


VB6  VB6には同じ機能は用意されていません。