LoginSignup
6
5

More than 5 years have passed since last update.

Reflectionで子クラスのメソッドを取得して実行してみた

Last updated at Posted at 2016-03-20

概要

C#のreflectionの勉強のメモです。
指定したクラスのメソッドを取得して実行するまで書きます。

クラスのPublicメソッドを全て取得する

下記のSampleClassのPublicメソッドを取得します。

public class SampleClass {
    public void TEST1(int value){
        Debug.Log("TEST1 " + value.ToString());
    }

    public void TEST2(int value){
        Debug.Log("TEST2" + value.ToString());
    }

    private void PrivateMethod(int value){
        Debug.Log("PrivateMethod" + value.ToString());
    }
}

上記のSampleClassのTypeのGetMethodsでPublicメソッドを取得してから、MethodInfoのInvokeで実行します。

public class ReflectionSample {
    public void TEST(){

        ///SampleClass内のPublicメソッドを全て取得(継承されたメンバは含まない)
        ///BindingFlags.Public パブリックメンバ BindingFlags.Instance インスタンスメソッド  BindingFlags.DeclaredOnly 継承されたメンバは含まない
        var methods = typeof(SampleClass).GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
        foreach (var m in methods)
        {
            var ins = Activator.CreateInstance(typeof(SampleClass));
            var objects = new object[]{1};
            m.Invoke(ins,objects);
        }
    }
}

privateなメソッドを取得したい時は、BindingFlags.PublicをBindingFlags.NonPublicに差し替えます。

継承先のクラスのPublicメンバを取得する。

下記のSampleBaseClassを継承したクラスのPublicメソッドを全て取得します。

public class SampleBaseClass {
}

public class SampleChildClass1 :SampleBaseClass {
    public void TESTChild1(int value){
        Debug.Log("SampleChildClass1 TESTChild1");
    }

    public void TESTChild2(int value){
        Debug.Log("SampleChildClass1 TESTChild2");
    }
}

public class SampleChildClass2 :SampleBaseClass {
    public void TESTChild1(int value){
        Debug.Log("SampleChildClass2 TESTChild1");
    }

    public void TESTChild2(int value){
        Debug.Log("SampleChildClass2 TESTChild2");
    }
}

やり方としては、Assembly.GetAssemblyで継承先のクラスを全て取得してから、GetMethodsでメソッドを取得します。

public class ReflectionSample2 {
    public void TEST(){
        //SampleBaseClassを継承したクラスを全て取得
        var clacces = Assembly.GetAssembly(typeof(SampleBaseClass)).GetTypes().Where(t => t.IsSubclassOf(typeof(SampleBaseClass)));

        foreach(var c in clacces){
            ///Publicメソッドを取得(継承されたメンバは含まない)
            foreach (var m in c.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
            {
                var ins = Activator.CreateInstance(c, null);
                m.Invoke(ins,new object[]{1});
            }
        }

    }
}

以上。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5