C#
Unity
reflection

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

More than 1 year has passed since last update.


概要

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});
}
}

}
}

以上。