【C#】定義されているメソッドの一覧を動的に取得・解析する方法

C#のリフレクション機能における Type.GetMethods メソッドを使用すると、特定のクラスや構造体に定義されているすべてのメソッド情報を配列として取得できます。

これは、プラグインシステムでロードした外部DLLの機能を調査したり、自動テストツールでテスト対象メソッドを列挙したりする際に利用されます。

ここでは、BindingFlags を活用して検索範囲を制御しながら、メソッド名や戻り値、引数の情報を一覧表示する実装例を解説します。

目次

メソッド一覧の取得と解析の実装

以下のサンプルコードでは、様々な種類のメソッド(public/private, static/instance, オーバーロード)を持つサンプルクラスを解析し、そのシグネチャ(定義内容)をコンソールに出力します。

サンプルコード

using System;
using System.Linq;
using System.Reflection;
using System.Text;

public class Program
{
    public static void Main()
    {
        // 1. 解析対象の型情報を取得
        Type targetType = typeof(SampleService);

        Console.WriteLine($"クラス: {targetType.Name} のメソッド一覧\n");

        // 2. 検索フラグの設定
        // Instance: インスタンスメソッド
        // Static: 静的メソッド
        // Public: 公開メソッド
        // NonPublic: 非公開メソッド
        // DeclaredOnly: 継承元のメソッド(ToStringなど)を除外
        var flags = BindingFlags.Instance | 
                    BindingFlags.Static | 
                    BindingFlags.Public | 
                    BindingFlags.NonPublic | 
                    BindingFlags.DeclaredOnly;

        // 3. メソッド情報の配列を取得
        MethodInfo[] methods = targetType.GetMethods(flags);

        foreach (var m in methods)
        {
            // メソッドの詳細情報を文字列に組み立てる
            string accessibility = GetAccessibility(m);
            string returnType = m.ReturnType.Name;
            string methodName = m.Name;
            
            // 引数情報の取得
            ParameterInfo[] paramsInfo = m.GetParameters();
            string paramString = string.Join(", ", paramsInfo.Select(p => $"{p.ParameterType.Name} {p.Name}"));

            Console.WriteLine($"[{accessibility}] {returnType} {methodName}({paramString})");
        }
    }

    /// <summary>
    /// MethodInfoからアクセス修飾子を簡易的に判定するヘルパー
    /// </summary>
    static string GetAccessibility(MethodInfo m)
    {
        if (m.IsPublic) return "public";
        if (m.IsPrivate) return "private";
        if (m.IsFamily) return "protected";
        if (m.IsAssembly) return "internal";
        return "unknown";
    }
}

// 解析対象のサンプルクラス
public class SampleService
{
    // 公開インスタンスメソッド
    public void Connect(string url) { }

    // オーバーロードされたメソッド
    public void Connect(string url, int timeout) { }

    // 戻り値のあるメソッド
    public int CalculateStatus() => 200;

    // 静的メソッド
    public static void ResetConfig() { }

    // 非公開メソッド
    private void InternalLog(string message) { }
}

実行結果

クラス: SampleService のメソッド一覧

[public] Void Connect(String url)
[public] Void Connect(String url, Int32 timeout)
[public] Int32 CalculateStatus()
[public] Void ResetConfig()
[private] Void InternalLog(String message)

解説と技術的なポイント

1. GetMethodsメソッドとBindingFlags

Type.GetProperties と同様に、GetMethodsBindingFlags を指定しない場合、デフォルトでは 「public な インスタンスおよび静的メソッド」 のみが返されます。 DeclaredOnly を指定することで、System.Object から継承している ToStringEquals などの標準メソッドを除外し、そのクラス独自の実装のみに焦点を当てることができます。

2. MethodInfoから取得できる情報

取得した MethodInfo オブジェクトからは、メソッドに関する豊富なメタデータにアクセスできます。

  • Name: メソッド名。
  • ReturnType: 戻り値の型(Type オブジェクト)。voidの場合は System.Void となります。
  • GetParameters(): 引数リストを ParameterInfo の配列として取得します。ここから引数の型、名前、デフォルト値などを調査できます。
  • IsPublic / IsStatic 等: メソッドの属性や修飾子を判定するプロパティです。

3. オーバーロードの扱い

メソッド名は同じでも引数が異なる「オーバーロード」されたメソッドは、それぞれ別の MethodInfo オブジェクトとして配列に含まれます。一意に特定するには、引数の型や数を確認する必要があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次