privateフィールドの値を取得したりprivateメソッドを実行したり
フィールドの場合はBindingFlags.GetField
, メソッドの場合はBindingFlags.InvokeMethod
を指定している.
GetField()
メソッドやGetMethod()
メソッドを使う場合は上記のフラグはそもそも必要ない.
ClassHoge hoge = new ClassHoge(); Type hogeType = hoge.GetType(); //private field FieldInfo field = hogeType.GetField("_fieldA", BindingFlags.NonPublic | BindingFlags.Instance); string val = (string)field.GetValue(hoge); Console.WriteLine(val); //or var val2 = (string)hogeType.InvokeMember("_fieldA", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, hoge, null); Console.WriteLine(val2); //private method var method = hogeType.GetMethod("MethodA", BindingFlags.NonPublic | BindingFlags.Instance); var result = method.Invoke(hoge, new object[] { 10, 20 }); Console.WriteLine(result); //or var result2 = (string)hogeType.InvokeMember("MethodA", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, hoge, new object[] { 30, 40 }); Console.WriteLine(result2); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public class ClassHoge { private string _fieldA = "This is private Field"; private string MethodA(int a, int b) { return $"This is private method: a = {a}, b = {b}"; } }
実行結果
This is private Field This is private Field This is private method: a = 10, b = 20 This is private method: a = 30, b = 40