ヘッダー
C# サンプル集
 

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

2020/10/25

→ Visual Basic のサンプルに切り替える

 

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

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

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

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

BindingFlags flag = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
//flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のメソッドも取得できます。

MethodInfo[] methods = typeof(string).GetMethods(flag); //←ここで対象を string と指定
//MethodInfo[] methods = 変数.GetType().GetMethods(flag); //←このようにすると、変数から呼び出せるメソッドの一覧を取得できます。

foreach (MethodInfo method in methods)
{
    if (method.IsSpecialName)
    {
        //プロパティ・イベント・演算子のために自動生成されたメソッドは対象外にします。
        continue;
    }
    System.Diagnostics.Debug.WriteLine(method.Name);
}

Debug.WriteLineが表示される場所

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

 

 

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

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

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

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

BindingFlags flag = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
//flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のメソッドも取得できます。

MethodInfo[] methods = typeof(int).GetMethods(flag); //←ここで対象を int と指定
//MethodInfo[] methods = 変数.GetType().GetMethods(flag); //←このようにすると、変数から呼び出せるメソッドの一覧を取得できます。

foreach (MethodInfo method in methods)
{
    if (method.IsSpecialName)
    {
        //プロパティ・イベント・演算子のために自動生成されたメソッドは対象外にします。
        continue;
    }

    //▼戻り値を出力
    System.Diagnostics.Debug.Write(method.ReturnType.Name + " ");

    //▼メソッド名を出力
    System.Diagnostics.Debug.Write(method.Name);

    //▼パラメーターリストを出力
    var paramDescriptions = new List<string>();
    foreach (ParameterInfo param in method.GetParameters())
    {
        paramDescriptions.Add(param.ParameterType.Name + " " + param.Name);
    }

    System.Diagnostics.Debug.Write("(");
    System.Diagnostics.Debug.Write(string.Join(", ", paramDescriptions.ToArray()));
    System.Diagnostics.Debug.Write(")");

    System.Diagnostics.Debug.WriteLine("");
}

Debug.WriteLineが表示される場所

実行すると次のように出力されます。型の表現は フレームワークの表現になるため、たとえば、intはInt32となり、boolは Boolean で表されるなどC#の表現とは異なります。

出力例抜粋

Int32 CompareTo(Object value)
Int32 CompareTo(Int32 value)
Boolean Equals(Object obj)
Boolean Equals(Int32 obj)
Int32 GetHashCode()
String ToString()

  • コメントの行を有効にするとprivate, protectedなど非publicなメソッドも取得できます。ただし、基底クラスのprivateなメソッドは取得できません。
  • flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果

 

 

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

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

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

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

BindingFlags flag = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
//flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のプロパティも取得できます。

PropertyInfo[] props = typeof(DateTime).GetProperties(flag); //←ここで対象を DateTime と指定
//PropertyInfo[] props = 変数.GetType().GetProperties(flag); //←このようにすると、変数から呼び出せるプロパティの一覧を取得できます。

foreach (PropertyInfo prop in props)
{
    System.Diagnostics.Debug.WriteLine(prop.Name);
}

 → Debug.WriteLineが表示される場所

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

 

 

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

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

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

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

BindingFlags flag = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
//flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のプロパティも取得できます。

PropertyInfo[] props = typeof(DateTime).GetProperties(flag); //←ここで対象を DateTime と指定
//PropertyInfo[] props = 変数.GetType().GetProperties(flag); //←このようにすると、変数から呼び出せるプロパティの一覧を取得できます。

foreach (PropertyInfo prop in props)
{
    //▼型を出力
    System.Diagnostics.Debug.Write(prop.PropertyType.Name);
    System.Diagnostics.Debug.Write(" ");

    //▼プロパティ名を出力
    System.Diagnostics.Debug.Write(prop.Name);

    System.Diagnostics.Debug.WriteLine("");
}

Debug.WriteLineが表示される場所

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

 

 

フィールドの一覧を取得

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

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

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

BindingFlags flag = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
//flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のフィールドも取得できます。

FieldInfo[] fields = typeof(Math).GetFields(flag); //←ここで対象を Math と指定
//FieldInfo[] fields = 変数.GetType().GetFields(flag); //←このようにすると、変数から呼び出せるフィールドの一覧を取得できます。

foreach (FieldInfo field in fields)
{
    //▼型を出力
    System.Diagnostics.Debug.Write(field.FieldType.Name);
    System.Diagnostics.Debug.Write(" ");

    //▼フィールド名を出力
    System.Diagnostics.Debug.Write(field.Name);

    System.Diagnostics.Debug.WriteLine("");
}

Debug.WriteLineが表示される場所

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

 

 

イベントの一覧を取得

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

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

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

BindingFlags flag = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
//flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のイベントも取得できます。

EventInfo[] events = typeof(System.Windows.Forms.Form).GetEvents(flag); //←ここで対象を Form と指定
//EventInfo[] events = 変数.GetType().GetEvents(flag); //←このようにすると、変数から呼び出せるイベントの一覧を取得できます。

foreach (EventInfo ev in events)
{

    //▼イベントハンドラー
    System.Diagnostics.Debug.Write(ev.EventHandlerType.Name + " ");

    //▼イベント名を出力
    System.Diagnostics.Debug.Write(ev.Name);

    //▼パラメーターリストを出力
    var paramDescriptions = new List<string>();

    foreach (var param in ev.EventHandlerType.GetMethod("Invoke").GetParameters())
    {
        paramDescriptions.Add(param.ParameterType.Name + " " + param.Name);
    }

    System.Diagnostics.Debug.Write("(");
    System.Diagnostics.Debug.Write(string.Join(", ", paramDescriptions.ToArray()));
    System.Diagnostics.Debug.Write(")");

    System.Diagnostics.Debug.WriteLine("");
}

Debug.WriteLineが表示される場所

実行すると次のように出力されます。型の表現は フレームワークの表現になるため、たとえば、intはInt32となり、boolは Boolean で表されるなどC#の表現とは異なります。

EventHandler AutoSizeChanged(Object sender, EventArgs e)
EventHandler AutoValidateChanged(Object sender, EventArgs e)
CancelEventHandler HelpButtonClicked(Object sender, CancelEventArgs e)
EventHandler MaximizedBoundsChanged(Object sender, EventArgs e)
EventHandler MaximumSizeChanged(Object sender, EventArgs e)
EventHandler MarginChanged(Object sender, EventArgs e)

  • コメントの行を有効にするとprivate, protectedなど非publicなイベントも取得できます。ただし、基底クラスのprivateなイベントは取得できません。
  • flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果

 

 

コンストラクターの一覧を取得

次の例は FileInfo クラスの public なコンストラクターの一覧を表示します。

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

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

BindingFlags flag = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
//flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のコンストラクターも取得できます。

ConstructorInfo[] ctors = typeof(System.IO.FileInfo).GetConstructors(flag); //←ここで対象を FileInfo と指定
//ConstructorInfo[] ctors = 変数.GetType().GetConstructors(flag); //←このようにすると、変数のクラス・構造体の持つコンストラクター一覧を取得できます。

foreach (ConstructorInfo ctor in ctors)
{

    //▼クラス名を出力。(C#ではコンストラクターの宣言は必ず クラス名 であるため模倣します)
    System.Diagnostics.Debug.Write(ctor.DeclaringType.Name);

    //▼パラメーターリストを出力
    var paramDescriptions = new List<string>();

    foreach (ParameterInfo param in ctor.GetParameters())
    {
        paramDescriptions.Add(param.ParameterType.Name + " " + param.Name);
    }

    System.Diagnostics.Debug.Write("(");
    System.Diagnostics.Debug.Write(string.Join(", ", paramDescriptions.ToArray()));
    System.Diagnostics.Debug.Write(")");

    System.Diagnostics.Debug.WriteLine("");
}

 → Debug.WriteLineが表示される場所

  • コメントの行を有効にするとprivate, protectedなど非publicなイベントも取得できます。ただし、基底クラスのprivateなイベントは取得できません。
  • flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果

 

 

メンバーの一覧を取得

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

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

public string GetClassMembers<T>(T o)
{
    return GetClassMembers<T>();
}

public string GetClassMembers<T>()
{
    BindingFlags flag = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
    //flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のメンバーも取得できます。

    MemberInfo[] members = typeof(T).GetMembers(flag);

    StringBuilder sb = new StringBuilder();

    foreach (MemberInfo member in members)
    {

        if (member.MemberType == MemberTypes.Constructor)
        {
            //コンストラクターの場合
            ConstructorInfo ctor = member as ConstructorInfo;

            //▼アクセススコープ(public, private等)
            sb.Append(GetAccessScope(ctor));

            //▼static
            if (ctor.IsStatic)
            {
                sb.Append("static ");
            }

            //▼クラス名
            sb.Append(member.DeclaringType.Name);

            //▼パラメーターリスト
            var paramDescriptions = new List<string>();

            foreach (ParameterInfo param in ctor.GetParameters())
            {
                paramDescriptions.Add(param.ParameterType.Name + " " + param.Name);
            }

            sb.Append("(" + string.Join(", ", paramDescriptions.ToArray()) + ")");

        }
        else if (member.MemberType == MemberTypes.Event)
        {
            //イベントの場合
            EventInfo ev = member as EventInfo;

            //▼アクセススコープ(public, private等)
            MethodInfo method = ev.AddMethod;
            sb.Append(GetAccessScope(method));

            //▼static
            if (method.IsStatic)
            {
                sb.Append("static ");
            }

            //▼宣言
            sb.Append("event ");

            //▼イベントハンドラー
            sb.Append(ev.EventHandlerType.Name + " ");

            //▼イベント名を出力
            sb.Append(ev.Name);

            //▼このコメントを解除するとイベントのパラメーターリストを出力できます。
            //var paramDescriptions = new List<string>();

            //foreach (var param in ev.EventHandlerType.GetMethod("Invoke").GetParameters())
            //{
            //    paramDescriptions.Add(param.ParameterType.Name + " " + param.Name);
            //}

            //sb.Append("(" + string.Join(", ", paramDescriptions.ToArray()) + ")");

        }
        else if (member.MemberType == MemberTypes.Field)
        {
            //フィールドの場合
             FieldInfo field = member as FieldInfo;

            //▼アクセススコープ(public, private等)
            sb.Append(GetAccessScope(field));

            //▼static と const
            if (field.IsStatic)
            {
                if (field.IsLiteral)
                 {
                    sb.Append("const ");
                }
                else
                {
                    sb.Append("static ");
                }
            }

            //▼型
            sb.Append(field.FieldType.Name + " ");

            //▼フィールド名を出力
            sb.Append(field.Name);

            //▼定数の場合、その値
            if (field.IsLiteral)
             {
                sb.Append(" = " + field.GetRawConstantValue().ToString());
            }

        }
        else if (member.MemberType == MemberTypes.Method)
        {
            //メソッドの場合
             MethodInfo method = member as MethodInfo;

            if (method.IsSpecialName)
             {
                continue;
            }

            //▼アクセススコープ(public, private等)
            sb.Append(GetAccessScope(method));

            //▼static
            if (method.IsStatic)
             {
                sb.Append("static ");
            }

            //▼戻り値を出力
            sb.Append(method.ReturnType.Name + " ");

            //▼メソッド名を出力
            sb.Append(method.Name);

            //▼パラメーターリストを出力
            var paramDescriptions = new List<string>();
            foreach (ParameterInfo param in method.GetParameters())
             {
                paramDescriptions.Add(param.ParameterType.Name + " " + param.Name);
            }

            sb.Append("(" + string.Join(", ", paramDescriptions.ToArray()) + ")");

        }
        else if (member.MemberType == MemberTypes.Property)
        {
            //プロパティの場合
             PropertyInfo prop = member as PropertyInfo;

            //▼アクセススコープ(public, private等)
            //この例ではgetでスコープを判断します。getが存在しない場合やgetとsetでアクセススコープが違う場合がありえますが、このサンプルでは想定しません。
            MethodInfo method = prop.GetMethod;

            sb.Append(GetAccessScope(method));

            //▼static
            if (method.IsStatic)
             {
                sb.Append("static ");
            }

            //▼型
            sb.Append(prop.PropertyType.Name + " ");

            //▼プロパティ名を出力
            sb.Append(prop.Name);

            //▼getterとsetterの有無
            sb.Append("{ ");
            if (prop.GetMethod != null)
            {
                sb.Append("get; ");
            }
            if (prop.SetMethod != null)
            {
                sb.Append("set; ");
            }
            sb.Append("}");
        }

        sb.AppendLine();
    }

    return sb.ToString();
}

public string GetAccessScope(MemberInfo member)
{

    if ((bool)(member.GetType().GetProperty("IsPublic").GetValue(member)))
    {
        return "public ";
    }

    if ((bool)(member.GetType().GetProperty("IsAssembly").GetValue(member)))
    {
        return "internal ";
    }

    if ((bool)(member.GetType().GetProperty("IsFamily").GetValue(member)))
    {
        return "protected ";
    }

    if ((bool)(member.GetType().GetProperty("IsFamilyOrAssembly").GetValue(member)))
    {
        return "protected internal ";
    }

    if ((bool)(member.GetType().GetProperty("IsFamilyAndAssembly").GetValue(member)))
    {
        return "private protected ";
    }

    if ((bool)(member.GetType().GetProperty("IsPrivate").GetValue(member)))
    {
        return "private ";
    }

    throw new ArgumentException();

}
  • コメントの行を有効にするとprivate, protectedなど非Publicなコンストラクターも取得できます。ただし、基底クラスのprivateなコンストラクターは取得できません。
  • flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
  • この例この例はC#のプログラムになぞらえて出力していますが、ref や インデクサーなど対応していないキーワード・構文も多々あります。プログラム内のコメントを参照してください。

出力例(抜粋)

public Void ResetText()
public Control GetNextControl(Control ctl, Boolean forward)
public Button()
public Color BackColor{ get; set; }
public static Point MousePosition{ get; }
public event EventHandler Click
public event MouseEventHandler MouseWheel

 

使用例使用例1:Buttonクラスのメンバー一覧を出力

string definition = GetClassMembers<Button>();
System.Diagnostics.Debug.WriteLine(definition);

DebDebug.WriteLineが表示される場所

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

string definition = GetClassMembers<DateTime>();
System.Diagnostics.Debug.WriteLine(definition);

Debug.WriteLineが表示される場所

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

DateTime d = new DateTime(2024, 6, 27);
string definition = GetClassMembers(d);
System.Diagnostics.Debug.WriteLine(definition);

Debug.WriteLineが表示される場所