パハットノート

※当サイトではGoogleアドセンス広告を利用しています

C# GetMethodsとMethodInfo




Type.GetMethods()について

  • GetMethodsにより指定したクラス内にある関数をMethodInfo[]型として取得できる。
  • 更に、BindingFlags型の引数を指定することで習得する関数の種類を設定できる。




BindingFlagsについて

  • GetMethodsの引数を指定することで習得する関数の種類を設定できる。
BindingFlags.Public public
BindingFlags.NonPublic private, protectedなど
BindingFlags.Static static
BindingFlags.Instance staticではない関数
BindingFlags.DeclaredOnly そのクラス内で指定した関数のみ(継承したのは含まない)




MethodInfoについて

  • GetMethodsで取得した関数を保存する型
  • MethodInfo.Nameで関数名を取得できる
  • MethodInfo.GetParameters()で関数の引数についてParameterInfo[]型で取得できる
  • MethodInfo.ReturnTypeで戻り値の型を取得できる




ParameterInfoについて

  • ParameterInfo.ParameterTypeでパラメータの型を取得できる




使用例

次のクラスでは、BindingFlagsの設定により

関数を取得するようにしている。

using System;
using System.Reflection;

class SampleBase
{
    protected void OverrideMethod()
    {
        Console.WriteLine(MethodBase.GetCurrentMethod().Name);
    }
}

class MethodsClass : SampleBase
{
    //static
    static void PrivateStaticVoidMethod(int a)
    {
        Console.WriteLine(MethodBase.GetCurrentMethod().Name);
    }
    static int PrivateStaticIntMethod(int b, string c)
    {
        Console.WriteLine(MethodBase.GetCurrentMethod().Name);
        return 0;
    }
    public static void ProtectedStaticVoidMethod()
    {
        Console.WriteLine(MethodBase.GetCurrentMethod().Name);
    }
    public static void PublicStaticVoidMethod()
    {
        Console.WriteLine(MethodBase.GetCurrentMethod().Name);
    }

    //Instance
    void PrivateInstanceVoidMethod()
    {
        Console.WriteLine(MethodBase.GetCurrentMethod().Name);
    }
    public string PublicInstanceStringMethod()
    {
        Console.WriteLine(MethodBase.GetCurrentMethod().Name);
        return null;
    }
    public void PublicInstanceVoidMethod()
    {
        Console.WriteLine(MethodBase.GetCurrentMethod().Name);
    }
}

public class Sample
{
    public static void Main()
    {
        BindingFlags flags = 
            BindingFlags.NonPublic 
            | BindingFlags.Public
            | BindingFlags.Instance 
            | BindingFlags.Static
            | BindingFlags.DeclaredOnly;

        MethodsClass methodsClass = new MethodsClass();
        Type type = methodsClass.GetType();
        MethodInfo[] methods = type.GetMethods(flags);

        //取得したメソッドの情報
        foreach (var m in methods)
        {
            Console.WriteLine($"メソッド名:{m.Name}");

            ParameterInfo[] ps = m.GetParameters();
            if (ps.Length == 0)
                Console.Write("引数なし");
            else
                for (int i = 0; i < ps.Length; i++)
                    Console.Write($"引数{i}{ps[i].ParameterType}, ");

            Console.WriteLine($"\n返り値 = {m.ReturnType}\n");
        }
    }
}


実行結果

メソッド名:PrivateStaticVoidMethod
引数0:System.Int32, 
返り値 = System.Void

メソッド名:PrivateStaticIntMethod
引数0:System.Int32, 引数1:System.String, 
返り値 = System.Int32

メソッド名:ProtectedStaticVoidMethod
引数なし
返り値 = System.Void

メソッド名:PublicStaticVoidMethod
引数なし
返り値 = System.Void

メソッド名:PrivateInstanceVoidMethod
引数なし
返り値 = System.Void

メソッド名:PublicInstanceStringMethod
引数なし
返り値 = System.String

メソッド名:PublicInstanceVoidMethod
引数なし
返り値 = System.Void