概要
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});
}
}
}
}
以上。