shuhelohelo’s blog

Xamarin.Forms多めです.

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